2015-12-12 93 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工具的兴趣。