Makefile |对包含在Header文件中的另一个Header文件的依赖关系

Makefile | Dependency on another Header file included in Header file

本文关键字:文件 Header 另一个 依赖 关系 Makefile 包含      更新时间:2023-10-16

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

如果bar.h有任何变化,是否会重新构建test.o

或者我应该在规则中特别提到bar.h,如下所示:

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

如果bar.h有任何变化,是否会重新构建test.o

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

当然,如果您将处理标头依赖关系留给了解它们的实体:编译器(假设GCC和GNU在本例中成功。)

  1. 根本不要将标头列为依赖项。

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

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

    DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
    
  4. 这些依赖文件包含到Makefile中。(领先的-意味着如果它们不存在,Make将不会生成错误,例如在第一次编译时。)

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

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

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

GCC(可能还有Clang)可以为您构建依赖项列表;通过这种方式,您可以简单地从它们的源(cpp)文件制作对象文件:

depend: .depend
.depend: $(SRC_FILES)
        rm -f ./.depend
        $(CC) $(CFLAGS) -MM $^ -MF  ./.depend;
include .depend
%.o: %.cpp
    $(CC) $(CFLAGS) -c $<

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