2014-02-14 77 views
0

我正在爲我的程序「p1」寫一個makefile,但無法讓我的「clean」工作。Clean指令不能在makefile中工作

#Default target 
p1: main.o bst_insert.o bst_info.o 
    gcc main.o bst_insert.o bst_info.o -o p1 

#START Dependencies for default target 
main.o: const.h bst_insert.h bst_info.h bst_struct_def.h main.c 
    gcc -c main.c 

bst_insert.o: bst_struct_def.h bst_insert.h bst_insert.c 
    gcc -c bst_insert.c 

bst_info.o: bst_struct_def.h bst_info.h bst_info.c 
    gcc -c bst_info.c 
#END Dependencies for default target 

#Target for removing unnecessary files. 
clean: 
    rm -f *.o core 

這裏是前/後:

make_before_after

無論出於何種原因, 「乾淨」 從未執行。有人能告訴我爲什麼嗎?我是新來的makefile,所以我可能會犯一個我不知道的非常明顯的錯誤。

回答

2

您應該手動運行:make p1 clean

此外,您Make文件可能已經大大縮短。

p1: bst_info.o bst_insert.o bst_struct_def.o 
     gcc $^ -o [email protected] 

clean: 
     rm -f *.o 
+0

好的,所以它不應該自行運行 - 它必須明確地稱爲? –

+0

我之前沒有在項目自述中看到這個:'當我們使用clean作爲目標運行make時,它應該刪除所有「.o」文件和名爲core的文件(如果有的話)。我認爲在創建p1之後,乾淨的目標必須自動運行。 –

+0

謝謝你讓我知道它必須手動運行。 –

3

如果你沒有給它一個建立在命令行上的特定目標,那麼make會始終在makefile中建立第一個目標。它將通過檢查所有先決條件及其先決條件等確保目標是最新的,並確保它們是最新的,然後構建目標(如果需要)。

除非您明確要求,否則不會構建任何不屬於該樹的目標。所以在這個例子中,clean不是第一個目標,也不是第一個目標的先決條件等,所以它不是建立的。如果您希望構建它,則應運行make clean以請求構建它,或者您需要將其添加到先決條件列表中。但是,這樣做很棘手,因爲您希望它運行,最後的。所以你需要這樣做:

clean: p1 
     rm -f *.o 

作爲第一個目標。現在clean將運行,但在此之前可能發生p1將建成等。

然而,這是非常不尋常的,不可能是你想要的。生成一個makefile的目的是讓你只需要重新編譯已經改變的文件,而不是重新編譯你沒有改變的文件。如果每次刪除所有對象文件,那麼每次運行make時都必須重新編譯所有內容。

如果你總是希望每次都重新編譯一遍,那麼make就沒用了。你可能只需編寫一個shell腳本來編譯你的代碼,然後刪除所有的對象。