2012-07-29 50 views
3

我的Makefile不會刪除中間文件。我已經設置了.INTERMEDIATE。這是我的Makefile:Makefile不會刪除中間文件

OBJECTS=prefixer.o stack.o 
CFLAGS=-Werror -Wmissing-prototypes -g 
LIBS=-lm 
CC=gcc 

prefixer : $(OBJECTS) 
    $(CC) -o prefixer $(OBJECTS) $(LIBS) 

prefixer.o : stack.h 
    $(CC) -c prefixer.c -o [email protected] $(CFLAGS) 
stack.o : stack.c stack.h 
    $(CC) -c stack.c -o [email protected] $(CFLAGS) 

.INTERMEDIATE: %.o 

.PHONY: clean 
clean : 
    -rm prefixer *.o 

有什麼不對.INTERMEDIATE

+4

旁邊的問題:我不知道'.INTERMEDIATE',但我能問你爲什麼要這樣做嗎? Makefile很好,所以你可以避免重建'.o'文件,其源文件是不變的。如果您想每次重建所有內容,爲什麼不使用腳本? – Shahbaz 2012-07-29 13:07:18

+0

你錯過了依賴''prefixer.c' - >'前綴。o' – 2012-07-29 15:32:06

+0

@BasileStarynkevitch你是什麼意思?它的第二個'prefixer.o:stack.h ....' – darksky 2012-07-29 15:37:30

回答

8

.INTERMEDIATE

角色見Gnu make special targets你大概的意思

.SECONDARY: $(OBJECTS) 

,因爲我認爲,如果你把.INTERMEDIATE那麼對象將永遠被刪除,你可能不希望出現這種情況。我認爲你不能有意義地把%.o作爲特殊目標的先決條件。

我會建議保留目標文件,以免浪費時間重新編譯它們。

運行一次make -p會教你很多關於make知道的規則。

使用remake -x(即remake)非常有幫助,至少可以調試複雜的Makefile -s。你也可以使用make -d,但我覺得它太冗長了。

您可能想要使用比make例如更好的構建器,例如, omake

+0

但是這並沒有做什麼,是嗎? '.SECONDARY $(OBJECTS)'會做什麼?我想清理目錄中的混亂,因此使用'.INTERMEDIATE'。其次,如果源已被修改,我將如何進行重新編譯?有任何想法嗎? – darksky 2012-07-29 15:05:02

+0

如果你沒有做任何特殊的目標技巧,'* .o'被構建並保存在目錄中(因爲''確實處理傳遞依賴性),並且'make'將會適當地重新編譯。當然你需要給* source * - > * object * dependencies。 – 2012-07-29 15:09:09

+0

出於某種原因,當我更改其中一個源文件並再次運行'make'時,它說'prefixer'是最新的..當它不是。我在這裏錯過了什麼?我認爲這個「功能」默認爲「make」,並且不需要任何額外的命令。 – darksky 2012-07-29 15:14:48

0

據我所知,.INTERMEDIATE不應該刪除中間文件,如果它已經存在。這是來自gnu make的文檔:

中間文件與其他所有文件一樣使用它們的規則重新編寫。但是中間文件的處理方式有兩種。

第一個區別是如果中間文件不存在會發生什麼情況。如果一個普通文件b不存在,並且考慮一個依賴於b的目標,它總是創建b,然後從b更新目標。但是如果b是一箇中間文件,那麼make可以單獨保留足夠好。它不會打擾更新b或最終目標,除非b的某些先決條件比目標更新或者有更新目標的其他原因。

第二個不同之處在於,如果make爲了更新其他內容而創建了b,則在不再需要b之後就會刪除b。因此,make之前不存在的中間文件也不存在。通過打印一個'rm -f'命令來向你顯示刪除報告,顯示它正在刪除哪個文件。

因此,確保在運行make之前目錄中沒有*.o

5

特殊目標.INTERMEDIATE不能與%通配符一起使用。試試這個:

.INTERMEDIATE: stack.o prefixer.o