我不確定我在這裏做錯了什麼。我試圖弄清楚我的項目有什麼依賴關係,不僅是源文件,還有非系統包含的頭文件。我從這個與這個主題相關的網站獲得了很多資源。爲什麼不在檢測頭依賴關係中進行檢測更改
如:Makefile header dependencies和Makefile, header dependencies
然而,當我做
touch MyHeader.h
作爲一個測試,看看這個工作,我的化妝過程失敗重建源文件,其中包括這個頭。所以,在這裏就是我在我的makefile
CPP=g++
CPPFLAGS=-Iadditional/includes -MMD
CXXFLAGS=-std=c++0x -c
# not every source file in this directory needs to be included in this build
# this is because of shared code with Windows
SOURCESFILTER = File1.cpp File2.cpp
OBJ_DIR=obj
SOURCES = $(filter-out $(SOURCEFILTER),$(wildcard *.cpp))
OBJECTS = $(addprefix $(OBJ_DIR)/,$(SOURCES:.cpp=.o))
DEPENDENCIES = $(OBJECTS:.o=.d)
.PHONY: archive
archive : $(OBJECTS)
ar mylib.a obj/*.o
-include $(DEPENDENCIES)
$(OBJ_DIR)/%.o: $(SOURCES) $(DEPENDENCIES)
$(CPP) $(CPPFLAGS) $(CXXFLAGS) $< -o [email protected]
我已經驗證了上述過程確實產生預期的* .d文件(的意義即是)。我假設我正確地包括他們。但是,如上所述,作爲一個測試,我這樣做: touch MyHeader.h
它與源文件位於同一目錄中,並重新運行make,包含此標頭的源文件都不會被重新映射。我錯過了什麼?
安迪
感謝您在正確的方向推。我現在明白我的make文件目標都是錯的。我改變了這一點,並會在提交此評論後更新我在這裏發佈的文字。我已經複製了make文件來嘗試黑客將它們構建到本地目錄。這有效,但我在開始時得到一個奇怪的錯誤,「致命的錯誤:打開依賴文件obj/*。d.d沒有這樣的文件」。確實沒有。這是來自它在本地構建的make文件嗎? – 2013-04-25 23:20:35
該錯誤看起來不像是一個錯誤。你剪了/粘貼了嗎?還是釋義?我建議您在變量賦值中將'='更改爲':='。也正如我之前提到的,將$(SOURCES)和$(DEPENDENCIES)作爲模式規則的先決條件是非常不正確的。一切都會一直重建。你不需要依賴關係作爲任何東西的先決條件,你應該只使用一個'%.c'作爲先決條件。我會更新我的答案。 – MadScientist 2013-04-26 00:11:49
謝謝你的幫助。這是我需要的。我非常接近答案,但只是不是那裏。我不確定如何讓過濾器在模式規則上工作,$(OBJ_DIR)/%。o:%.cpp。這似乎是它會編譯每個源文件,顯然我不想這樣做。我沒有在GNU手冊中找到SOURCES變量如何影響這個,但顯然這是我想要的。再次感謝。 – 2013-04-26 13:56:57