2016-11-12 44 views
0

(對不起,我英文不好,我是德國人)GNU使汽車的依賴性取決於目錄

您好程序員,

我使用GNU讓我的C++項目,但我有一些麻煩的自動依賴關係: 如果我執行「make objects/file.o」,它會告訴我,即使source/file.cpp包含的文件已更改,objects/file.o也已保持最新。 奇怪的是,如果我將DEP_DIR和OBJ_DIR更改爲「。」一切正常。 這裏是我的makefile(不完全):

SRC_DIR := source 
DEP_DIR := dependencies 
OBJ_DIR := objects 

$(shell mkdir -p $(dir EXE_PATH)) 

-include $(addprefix $(DEP_DIR)/, $(NAMES:=.d)) 

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp 
     $(CXX) -c $(CFLAGS) $(SRC_DIR)/$*.cpp -o [email protected] 
     $(CXX) -MM $(CFLAGS) $^ > $(DEP_DIR)/$*.d 

$(EXE_PATH) : $(addprefix $(OBJ_DIR)/, $(NAMES:=.o)) 
     $(CXX) $(LINK_FLAGS) $^ -o $(EXE_PATH) 

all : $(EXE_PATH) 

run : 
     $(EXE_PATH) 

carun : $(EXE_PATH) 
     $(EXE_PATH) 

clean: 
     rm -f EXE_PATH 

我會感激如果有人可以解釋這個奇怪的問題給我。

+0

它應該是'CXX',而不是'CPP'。 'CPP'是C預處理器,'CXX'是C++編譯器 – igagis

+0

否則,我建議您使用https://github.com/igagis/prorab/blob/master/wiki/TutorialBasicConcepts.md它執行所有這些自動依賴對你而言,你不必擔心。 – igagis

回答

0

這不是如何完成依賴關係生成,您可以生成依賴關係作爲編譯的side effect。還可以使用內置變量名稱CXX,CPPFLAGS,CXXFLAGS,LDFLAGSLDLIBS,並使用內置的回收make。

.PHONY: all 
all: Release/$(EXE_NAME) 
    echo "finished building... in theory" 

Release/$(EXE_NAME): CC := $(CXX) 
Release/$(EXE_NAME): $(OBJS) | Release 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 

$(objDir)/%.o: CPPFLAGS += -MMD -MP 
$(objDir)/%.o: $(srcPath)/%.cpp | $(objDir) 
    $(COMPILE.cpp) $(OUTPUT_OPTION) $< 

$(objDir) Release: ; mkdir -p [email protected] 

-include $(OBJS:.o=.d) 
1

要回答你關於你所看到的錯誤問題:出現在目標或先決條件列表宏和函數立即展開爲makefile文件被解析,沒過多久,使開始運行,這將匹配模式規則並替換%。所以,在這條線:而提出的,是在生成文件閱讀

$(depDir)/%.d : $(srcPath)/%.cpp $(shell cat $(depDir)/%.d) 

shell函數被調用,而當時它只是使用逐字字符串%.d,因爲沒有模式匹配也沒發生。

正如其他答案中所提到的,這不是正確的自動生成依賴關係的方法(你實際上沒有展示如何生成這些.d文件,因此很難給出具體的建議)。

如果你想了解如何做到這一點,更現代和有效的方式,你可以檢查出this blog post