我想構建一些C++代碼。我已經有了一個可以自動計算依賴關係的魔法Makefile,但我想將目標文件保存在單獨的目錄中。因此,結構是這樣的:通過兩步依賴關係計算了解Makefile
- 的Makefile
- 源/一個/
- 源/ B/
- 源/ C/
- OBJ/
我能跑使用obj /前綴將源代碼轉換爲對象的Makefile,但是當我想要反向依賴計算時,事情變得麻煩。
問題是,幾乎所有的Makefile示例都是在一步完成的,從.cpp(%.d: %.cpp
)創建.d。我花了一些時間試圖理解Makefile並通過試驗和錯誤來修復它。最後,我已經有了一個工作腳本:
DIRS := a b c
SOURCES := $(foreach dir,$(DIRS),$(wildcard source/$(dir)/*.cpp))
OBJECTS := $(patsubst %.cpp,obj/%.o,$(SOURCES))
obj/%.d: %.cpp
@mkdir -p $(@D)
@$(CXX) -E $(CXXFLAGS) -MM -MP -MF [email protected] -MQ $(@:.d=.o) -MQ [email protected] $<
obj/%.o: %.cpp obj/%.d
@$(CXX) $(CXXFLAGS) -o [email protected] -c $<
project: $(OBJECTS)
...
-include $(OBJECTS:.o=.d)
但我仍然不知道爲什麼我需要有獨立的步驟爲CPP-> d和CPP & d - > O(或者也許我理解 - 但那麼我不知道爲什麼大多數例子不需要這個)。
你不**需要單獨的步驟。你可以合併它們。這是否回答你的問題? – Beta
@Beta:我不明白爲什麼所有的例子都顯示轉換'%.d:%.cpp'。目標二進制文件取決於目標文件(.o),而不是依賴文件,但在Makefile中,目標文件沒有規則,除非存在某些依賴文件。 – Marcin