Makefile |依赖于头文件中包含的另一个头文件

时间:2015-12-12 11:04:37

标签: c++ 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 如下:

{{1}}

2 个答案:

答案 0 :(得分:6)

  

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

否。 Make无法了解此依赖关系,也无法检查#include中的更改。

当然,除非您将处理标头依赖关系留给知道的实体:编译器。 (假设在此示例中使用GCC和GNU。)

  1. 不要将标题列为依赖

  2. 在项目中生成文件列表。

    SRCFILES := ...
    
  3. 为每个.d生成一个依赖文件列表,一个SRCFILE文件。

    DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
    
  4. 将这些依赖项文件包含到您的Makefile中。 (前导-表示如果不存在,Make将不会生成错误,例如在第一次编译时。)

    -include $(DEPFILES)
    
  5. 使用通用规则,让编译器在编译每个源文件时生成一个头依赖项列表。

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

    -MMD生成Make规则,使目标文件依赖于包含的任何(非系统)头文件,名为*.d-MP添加了虚拟规则,可以避免在源文件中删除时出现错误。

答案 1 :(得分:3)

GCC(可能还有Clang)可以为你建立一个依赖列表;这样,您只需从源(cpp)文件中创建目标文件:

depend: .depend

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

include .depend

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

您可能还会对makedepend工具感兴趣。