2015-06-20 56 views
-1

我有2 .cpp文件:main.cppA.cppinclude dir中的一些頭文件。Makefile不重新編譯頭文件更改

我正在嘗試編寫一個makefile,在頭文件發生更改時重新編譯。

現在我試着按照示例here中的方法概述。但是我無法開始。這是我迄今的嘗試。

CC := g++ 
OBJS := main.o A.o 
OUTPUT := program.exe 
INCLUDE_DIR := -I ./include \ 

#linking step 
all: $(OBJS) 
    $(CC) $(INCLUDE_DIR) $(OBJS) -o $(OUTPUT) 

#compile and generate dependency info 
%.o : %.cpp 
    $(CC) $(INCLUDE_DIR) -c $*.cpp -o $*.o 
    $(CC) $(INCLUDE_DIR) -MMD -c -o [email protected] $< 

-include *.d 
+1

你是什麼意思「你無法入門」?什麼是錯誤? – Barry

回答

2

你沒有正確包含你的依賴文件。那裏的通配符不會做你想要的。這將會是簡單的只是:

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

要真正通配符的依賴關係,你需要做的:

-include $(wildcard *.d) 

注意,GCC實際上可以讓你產生依賴,並在目標文件同時。這可能只是你的規則。此外,我覺得明確指出一切事情的進展情況會更好,以防發生任何問題:

%.o : %.cpp 
    $(CC) $(INCLUDE_DIR) -c $< -o [email protected] -MMD -MF $(@:.o=.d) 
+1

你能解釋一下'-MMD'和'-MF'標誌是如何工作的嗎? – SU3

+1

@ SU3請參見[預處理器選項](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html),特別是'-M'的描述。 – Barry

+0

使用'MMD'時,'MF'標誌是毫無意義的,與'MD'標誌相反。 – Chnossos

1

您需要將頭文件包含在依賴關係列表中。例如:

%.o : %.cpp %.hh 
    $(CC) $(INCLUDE_DIR) -c $*.cpp -o $*.o 
    $(CC) $(INCLUDE_DIR) -MMD -c -o [email protected] $< 

如果你對每一個a.cppa.hh

make文件的語法是

target: dependency_1 dependency_2 etc 
    rule 

所有的依賴,當他們最後一次更新的時間進行檢查,如果其中一方具有時間戳更近那麼目標,執行規則。在您的Makefile中,依賴關係列表中沒有任何標題。

+0

對於每個%.cpp,可能沒有%.hh,並且自動生成依賴關係的整個要點是使它們正確。 – Barry

+0

@Barry我明白,這就是爲什麼我寫了「**如果**你對每個'a.cpp'都有'a.hh'」。另外,我只是擴大了答案。 – SU3

+0

這是一個很大的假設,可能永遠不會是真的,因爲OP的目標是讓編譯器通過'* .d'文件爲他生成正確的依賴關係,所以變得更加不必要。這個答案是錯誤的。 – Barry

相關問題