2015-10-20 76 views
0

我想知道如何強制make以正確的方式構建庫後刪除.o文件。如何刪除makefile中的中間目標文件

all: libtest.a 

libtest.a: foo.o bar.o 
    ar r [email protected] $? 

%.o : %.c 
    gcc -o [email protected] -c $< 

與.o文件標記爲.INTERMEDIATE的問題是,所有的.o文件被重新編譯,即使有一個源文件的更改,即使它們已經存在於檔案。有沒有辦法做到這一點。刪除目標文件並不重新編譯未更改的源文件以更新庫。

+0

據我所知,如果你刪除所有的.o的編譯後庫中,即使只有一個源文件發生更改,也需要再次創建它們才能再次編譯庫。 – dietbacon

+0

但更新庫時不需要未更改的對象文件。假設.o文件沒有被刪除,只有foo.c發生了變化。然後,可以使用簡單的「ar libtest.a foo.o」更新庫。 bar.o甚至不需要。但是,如果bar.o丟失,它會重新編譯它。 – user1353535

+0

他們是需要的,但是因爲他們根本沒有改變,所以你不必再創建它們,只需要改變它們。它是這樣的:檢查哪些更改,重新創建.o爲所有.o's並創建庫 – dietbacon

回答

0

如果foo.c已經改變,那麼libtest.a是過時的,所以要必須重建foo.o然後libtest.a,但bar.olibtest.a的先決條件太多,所以請直到bar.o存在不能執行libtest.a規則,所以它重建bar.o以及

最好的解決方案(我知道)是把圖書館作爲一套獨立的目標:

.PHONY: all 
all: libtest.a(foo.o bar.o) 

libtest.a(%.o): %.o 
    ar r libtest.a $^ 

(使能處理歸檔成員這種方式,但即使不能,我們仍然可以用一些僞目標這種做法。)

+0

此方法對於並行構建是否安全? – user1353535

+0

@ user1353535:我想這取決於'ar'是否是線程安全的;所以我不知道。 – Beta

0

會改變arar r [email protected] $? && rm *.o(或類似的東西的工作?

+0

這不會有幫助,因爲所有的.o文件在下一次即使是單個源文件更改時也必須重建。 – user1353535

相關問題