![](/img/trans.png)
[英]How to write a common rule in Makefile for multiple target dependency pairs
[英]Makefile multiple dependency lines for a single target?
要生成依賴文件,我可以使用類似這樣的東西來生成依賴文件:
-include $(patsubst %.cpp,build/%.d,$(SRC))
build/%.o: %.cpp
$(CC) $(CXXFLAGS) -c -o $@ $<
$(CC) $(CXXFLAGS) -MM -MT $@ -MF $(patsubst %.o,%.d,%@) $<
這會生成所有內容並將 object 和依賴文件放入我想要的構建目錄中。 但這為<file>.o
目標創建了兩條依賴線,一條來自-include
規則和所有 header 依賴關系,一條來自模式規則。 這是否會得到正確解釋,即當修改 header 時,將通過為模式規則指定的命令重新編譯 object?
編輯:所以這種方法實際上效果很好。 我想我希望有人能提供一個答案,讓我深入了解make
在這些情況下究竟做了什么。 例如,如果對同一目標的兩條規則給出不同的命令怎么辦? 我的猜測是它會給出一個錯誤,因為執行哪個命令並不明顯。
您應該再添加一個模式規則來表達.cpp
和.d
文件之間的依賴關系,並使用該規則來創建.d
文件(您問題的模式規則中的第二行),而不是無條件地創建.d
文件。 如果 header 或源文件發生更改,則在所有.h
和.cpp
文件以及所有.d
文件之間引入另一個依賴項以強制重新創建.d
文件可能是有意義的。
這是 .d 文件的單獨規則(希望我做對了):
-include $(patsubst %.cpp,build/%.d,$(SRC))
build/%.o: %.cpp
$(CC) $(CXXFLAGS) -c -o $@ $<
build/%.d: %.cpp
$(CC) $(CXXFLAGS) -MM -MT $@ -MF $<
編輯:所以這種方法實際上效果很好。 我想我希望有人能提供一個答案,讓我深入了解 make 在這些情況下究竟做了什么。
恐怕目前它只會偶然起作用(或者您沒有提供make文件中的所有相關部分)。 看,你沒有表達.d
文件和.cpp
文件之間的任何依賴關系。 但是,這是必需的,以便您的.d
文件在包含為 make 文件片段之前得到更新。
例如,如果對同一目標的兩條規則給出不同的命令怎么辦? 我的猜測是它會給出一個錯誤,因為執行哪個命令並不明顯。
使用這種語法,它不會有所作為。 但是在某些特殊情況下,將規則一分為二(盡管其他規則相同)是有好處的。 我強烈建議您閱讀“使用 GNU Make 管理項目”一書,以掌握使用 GNU Make 的各種方式。 與 GNU Make 相關的唯一其他建議是閱讀此處的論文。
是的,您可以為一個文件指定多個規則,並將它們合並為一個。 請參閱GNU Make 文檔。
[...] 一個文件只能執行一個配方。 [...] 一個只有先決條件的額外規則可用於一次為許多文件提供一些額外的先決條件。
我認為.d
文件應該有單獨的規則。 它在許多項目中的名稱是deps
或depend
。
POSIX 7還表示給定目標的多行工作http://pubs.opengroup.org/onlinepubs/9699919799/
具有先決條件但沒有任何命令的目標可用於添加到該目標的先決條件列表。 任何給定目標只有一個目標規則可以包含命令。
只要只有一個人有命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.