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

sps*_*sps 4 c++ makefile

假设我有以下规则Makefile.

test.o: test.cpp foo.h
        g++ -c -o test.o test.cpp
Run Code Online (Sandbox Code Playgroud)

现在假设foo.h包括bar.h如下所示.

user $ head -n 5 foo.h
#include"bar.h"
/*
.
.
*/
user $  
Run Code Online (Sandbox Code Playgroud)

test.o如果有任何变化,是否会再次建造bar.h

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

test.o: test.cpp foo.h bar.h
        g++ -c -o test.o test.cpp
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 6

test.o如果有任何变化,是否会再次建造bar.h

没有.Make无法知道这种依赖关系,也无法检查你#include的变化.

除此之外,当然,如果你离开处理头依赖于谁的实体知道关于他们:编译器.(假设在此示例中使用GCC和GNU.)

  1. 作为依赖没有列出标题,在所有.

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

    SRCFILES := ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 生成依赖项文件列表,.d每个文件一个文件SRCFILE.

    DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 这些依赖项文件包含在Makefile中.(-如果不存在,则主要方式Make不会生成错误,例如在第一次编译时.)

    -include $(DEPFILES)
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用通用规则,让编译器在编译每个源文件期间生成标头依赖项列表.

    %.o: %.cpp Makefile
        @$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
    
    Run Code Online (Sandbox Code Playgroud)

    -MMD生成制定规则,使目标文件依赖于包含的任何(非系统)头文件,命名*.d.-MP添加虚拟规则,以避免从源文件中删除头文件时出错.