簡體   English   中英

為什么我非常簡單的makefile無法正常工作

[英]Why is my very simple makefile not working

當我說的很簡單時,我是說真的。 我有一個main.c和一個名為input_error.h的頭文件。

main.o : main.c input_error.h
    gcc -c main.c

當我運行命令“ make”時,將執行gcc -c main.c,但它不會更新我對main.c文件所做的任何更改。 當我手動輸入“ gcc main.c”時,它可以正常工作。

編輯:似乎我需要添加另一個規則,但是我不確定這意味着什么

目前,您的makefile僅生成.o文件。 您可以通過兩種方式構建二進制文件。 請注意,make要求target語句中的縮進是一個制表符,而不是4個空格,因為它可能已被瀏覽器轉換為縮進。

分別構建.o然后鏈接二進制文件。 請注意,使用-c開關使GCC只建目標文件。

main: main.o
    gcc main.o -o main

main.o : main.c input_error.h
    gcc -c main.c -o main.o

一步建立

main: main.c input_error.h
    gcc main.c -o main

您也可避免在你的makefile重復使用特殊的變量來表示目標($ @),第一依賴($ <)和所有(@ ^)的依賴關系。

例如,上面的一行可能變成

main.o : main.c input_error.h
        gcc -c $< -o $@

乍一看似乎有點神秘,但是您已經習慣了。 @kaylums答案中的隱式規則也將有助於減少鍵入。

您擁有的Makefile只有一個規則來編譯.o文件。 也就是說,它沒有鏈接最終可執行文件的任何規則。

make具有用於建立許多常見目標的隱式規則。 因此,您的Makefile可能如下所示:

all: main

main.o : input_error.h

進一步說明:

  • all: main :由於這是第一個目標,因此如果沒有為make命令行提供顯式目標,則默認情況下將構建該目標。 它取決於單個目標main對象。
  • 沒有針對main顯式規則,但是make具有一個隱式規則,它將根據main.c構建。
  • main.o : input_error.h :告訴makemain.o需要,如果重建input_error.h變化。 無需將main.c放在此處,因為make具有main.c式知識。 也不需要顯式命令,因為make也具有隱式命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM