2012-10-12 86 views
1

我喜歡使用g++ -MM功能來自動構建我的依賴關係。我這樣做的方法如下:要包含或包含自動生成的依賴項?

include $(ALLOBJ:%.o=%.d) 

%.d: %.cxx 
    @echo making dependencies for $< 
    @g++ -MM $(CXXFLAGS) $< -o [email protected] 
    @sed -i 's,$*\.o,& [email protected] ,g' [email protected] 

基本上我可以給這個規則ALLOBJ,它會:

  1. 轉換每.o名稱爲.d名稱,include它,
  2. 當它找不到.d時,它將從.cxx文件創建它
    • 的最後一行規則會將.d文件的名稱添加到文件本身,以便自動更新依賴項。

產生的問題是,當我刪除標題:在.d文件仍然希望能夠找到它,並會得到開心,當它不存在。一種解決方案是用-include替換include,並在編譯規則中構建依賴關係。不幸的是,這需要每個編譯規則的依賴關係生成線,並且還會忽略所有其他include錯誤(這似乎有風險)。有沒有其他簡單的方法來自動構建依賴關係,從而避免此問題?

回答

2

閱讀上述手動多一點,並感謝@jackKelly和@貝塔的反應,我發現了以下解決方案:

include $(ALLOBJ:%.o=%.d) 

%.d: %.cxx 
    @echo making dependencies for $< 
    @g++ -MM -MP -MT $*.d -MT $*.o $(CXXFLAGS) $< -o [email protected] 

總結國旗:

  • -MM:構建依賴關係(而不是編譯)
  • -MP:爲所有標題構建「虛擬」目標。這可以防止在標題被刪除並因此無法找到時發出抱怨。
  • -MT:指定規則的目標。這使我們可以告訴使.d文件依賴於標頭而不訴諸醜陋的sed規則。

我不相信我的解決方案比@ Beta的解決方案更正確。我傾向於在同一個makefile中爲C++文件使用多個編譯規則,因此對於所有這些文件,只有一個依賴關係規則比在每個編譯規則中生成依賴關係稍微更清晰(在我的情況下)。

2

要重申我的回答對the other question,我做這種方式:

%.o: %.cpp 
    @echo making [email protected] and dependencies for $< at the same time 
    @$(CC) -MD -c $(CXXFLAGS) -o [email protected] $< 
    @cp $*.d $*.P 
    @sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
     -e '/^$$/ d' -e 's/$$/ :/' < $*.P >> $*.d 
    @rm $*.P 

-include $(ALLOBJ:%.o=%.d) 

編輯:

它......它產生依賴文件,但更乾淨和沒有sed命令:

%.o: %.cpp 
    @echo making [email protected] and dependencies for $< at the same time 
    @$(CC) -c $(CXXFLAGS) -o [email protected] $< 
    @$(CC) -MM -MP $(CXXFLAGS) $< -o $*.d 

-include *.d 

所以現在我要修改我在自己的makefile的%.o規則。從現在開始,我會編輯,嘲笑我一些@JackKelly 。哦,這是一個黑色的日子。

+0

有兩個問題:'-MD'做了什麼?呃真的很長時間會發生什麼? – Shep

+0

@Shep:'-MD'創建*兩個*文件,'foo.o'和'foo.d'。但是這個'foo.d'列出了'foo.h'作爲'foo.o'的前綴,所以它受到你描述的問題的影響。長'sed'命令修改'foo.d',將preq作爲規則的目標而不需要命令(例如'foo.h:')。這足以安撫Make和防止錯誤; 'foo.h'丟失了,但是有一條規則,所以請相信所有的東西都會被照顧。 – Beta

+2

@Beta:你爲什麼不把'-MP'傳遞給'gcc'? –

相關問題