我喜歡使用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
,它會:
- 轉換每
.o
名稱爲.d
名稱,include
它, - 當它找不到
.d
時,它將從.cxx
文件創建它- 的最後一行規則會將
.d
文件的名稱添加到文件本身,以便自動更新依賴項。
- 的最後一行規則會將
產生的問題是,當我刪除標題:在.d
文件仍然希望能夠找到它,並會得到開心,當它不存在。一種解決方案是用-include
替換include
,並在編譯規則中構建依賴關係。不幸的是,這需要每個編譯規則的依賴關係生成線,並且還會忽略所有其他include
錯誤(這似乎有風險)。有沒有其他簡單的方法來自動構建依賴關係,從而避免此問題?
有兩個問題:'-MD'做了什麼?呃真的很長時間會發生什麼? – Shep
@Shep:'-MD'創建*兩個*文件,'foo.o'和'foo.d'。但是這個'foo.d'列出了'foo.h'作爲'foo.o'的前綴,所以它受到你描述的問題的影響。長'sed'命令修改'foo.d',將preq作爲規則的目標而不需要命令(例如'foo.h:')。這足以安撫Make和防止錯誤; 'foo.h'丟失了,但是有一條規則,所以請相信所有的東西都會被照顧。 – Beta
@Beta:你爲什麼不把'-MP'傳遞給'gcc'? –