2013-04-25 30 views
1

我不確定我在這裏做錯了什麼。我試圖弄清楚我的項目有什麼依賴關係,不僅是源文件,還有非系統包含的頭文件。我從這個與這個主題相關的網站獲得了很多資源。爲什麼不在檢測頭依賴關係中進行檢測更改

如:Makefile header dependenciesMakefile, 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,包含此標頭的源文件都不會被重新映射。我錯過了什麼?

安迪

回答

4

首先,你可以不包括後綴規則的先決條件。即使你可以,你肯定會希望包括$(SOURCES)$(DEPENDENCIES),因爲那樣會導致對象重建每當任何源或依賴文件改變。

其次,您不能在預期的目錄下的其他目錄中創建目標文件。 Make會把想要找到目標的地方放在變量[email protected]中,並且你必須準確地將輸出寫入該位置。如果您看到過修改目標的規則,例如上述使用obj/[email protected]的地方,那麼這將不起作用。

最有可能的是海灣合作委員會的書面文件作爲obj/foo.d,但你include試圖包括foo.d但並不存在......不過既然你使用-include化妝不抱怨。

我建議您先將目標文件寫入本地目錄,並使用依賴關係進行操作。一旦有效,然後閱讀如何將目標寫入其他目錄和/或再次詢問。

ETA:

嘗試這樣:

CXX := g++ 
CPPFLAGS := -Iadditional/includes -MMD 
CXXFLAGS := -std=c++0x 
# 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: mylib.a 

mylib.a: $(OBJECTS) 
     $(AR) [email protected] $^ 

-include $(DEPENDENCIES) 

$(OBJ_DIR)/%.o: %.cpp 
     $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $< 
+0

感謝您在正確的方向推。我現在明白我的make文件目標都是錯的。我改變了這一點,並會在提交此評論後更新我在這裏發佈的文字。我已經複製了make文件來嘗試黑客將它們構建到本地目錄。這有效,但我在開始時得到一個奇怪的錯誤,「致命的錯誤:打開依賴文件obj/*。d.d沒有這樣的文件」。確實沒有。這是來自它在本地構建的make文件嗎? – 2013-04-25 23:20:35

+0

該錯誤看起來不像是一個錯誤。你剪了/粘貼了嗎?還是釋義?我建議您在變量賦值中將'='更改爲':='。也正如我之前提到的,將$(SOURCES)和$(DEPENDENCIES)作爲模式規則的先決條件是非常不正確的。一切都會一直重建。你不需要依賴關係作爲任何東西的先決條件,你應該只使用一個'%.c'作爲先決條件。我會更新我的答案。 – MadScientist 2013-04-26 00:11:49

+0

謝謝你的幫助。這是我需要的。我非常接近答案,但只是不是那裏。我不確定如何讓過濾器在模式規則上工作,$(OBJ_DIR)/%。o:%.cpp。這似乎是它會編譯每個源文件,顯然我不想這樣做。我沒有在GNU手冊中找到SOURCES變量如何影響這個,但顯然這是我想要的。再次感謝。 – 2013-04-26 13:56:57