假设我有以下规则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)
test.o如果有任何变化,是否会再次建造bar.h?
没有.Make无法知道这种依赖关系,也无法检查你#include的变化.
除此之外,当然,如果你离开处理头依赖于谁的实体知道关于他们:编译器.(假设在此示例中使用GCC和GNU.)
作为依赖没有列出标题,在所有.
生成项目中的源文件列表.
SRCFILES := ...
Run Code Online (Sandbox Code Playgroud)生成依赖项文件列表,.d每个文件一个文件SRCFILE.
DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
Run Code Online (Sandbox Code Playgroud)将这些依赖项文件包含在Makefile中.(-如果不存在,则主要方式Make不会生成错误,例如在第一次编译时.)
-include $(DEPFILES)
Run Code Online (Sandbox Code Playgroud)使用通用规则,让编译器在编译每个源文件期间生成标头依赖项列表.
%.o: %.cpp Makefile
@$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
-MMD生成制定规则,使目标文件依赖于包含的任何(非系统)头文件,命名*.d.-MP添加虚拟规则,以避免从源文件中删除头文件时出错.