[英]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
:告訴make
說main.o
需要,如果重建input_error.h
變化。 無需將main.c
放在此處,因為make
具有main.c
式知識。 也不需要顯式命令,因為make
也具有隱式命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.