假设我在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

最佳答案



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

当然,除非您将处理头文件的依赖项留给了解它们的实体:编译器。 (假设在此示例中为GCC和GNU。)

  • 根本不将 header 列出为依赖项。
  • 生成项目中的源文件列表。

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

    DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
    
  • 将那些依赖文件包含到您的Makefile中。 (开头的-表示Make不存在时不会产生错误,例如在第一次编译时)。

    -include $(DEPFILES)
    
  • 使用通用规则,让编译器在每个源文件的编译过程中生成 header 依赖项列表。

    %.o: %.cpp Makefile
        @$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
    
    -MMD生成使对象文件依赖于所包含的任何(非系统)头文件*.d的Make规则。 -MP添加了虚拟规则,可以避免在从源文件中删除头文件时出错。
  • 08-06 00:25
    查看更多