2015-12-12 94 views
4

假設我在Makefile中有以下規則。Makefile |頭文件中包含的另一個頭文件的依賴關係

test.o: test.cpp foo.h 
     g++ -c -o test.o test.cpp 

現在假設foo.h包括bar.h,如下所示。

user $ head -n 5 foo.h 
#include"bar.h" 
/* 
. 
. 
*/ 
user $ 

請問test.o重新建造是否有bar.h什麼變化?

或者我應該特別提到在規則如下bar.h

test.o: test.cpp foo.h bar.h 
     g++ -c -o test.o test.cpp 

回答

4

如果bar.h中有任何更改,是否會再次構建test.o

號製作就無法知道這種依賴關係,或檢查你的#include變遷的方式。

除,當然,如果你離開處理頭依賴於誰知道有關它們的實體:編譯器。 (假設GCC和GNU make在這個例子中)。

  1. 如在所有依賴性不列出標題。

  2. 在您的項目中生成源文件列表文件。

    SRCFILES := ... 
    
  3. 生成的依賴文件列表,一個.d文件每個SRCFILE

    DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES)) 
    
  4. 包括這些相關文件到你的Makefile。 (領先-手段做不會產生,如果他們不存在,例如在第一次編譯錯誤。)

    -include $(DEPFILES) 
    
  5. 使用通用規則,讓編譯器生成過程中頭部依賴性列表彙編每個源文件。

    %.o: %.cpp Makefile 
        @$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o [email protected] 
    

    -MMD生成制定規則使目標文件依賴於任何(非系統)上的頭文件包括,命名*.d-MP添加了虛擬規則,以避免錯誤,如果頭文件是從您的源中刪除

2

GCC(大概鏘)可以構建依賴於你的列表;通過這種方式,你可以簡單地從他們的源對象文件(CPP)文件:

depend: .depend 

.depend: $(SRC_FILES) 
     rm -f ./.depend 
     $(CC) $(CFLAGS) -MM $^ -MF ./.depend; 

include .depend 

%.o: %.cpp 
    $(CC) $(CFLAGS) -c $< 

您也可能會發現在makedepend工具的興趣。