假设我在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。)
SRCFILES := ...
.d
一个SRCFILE
文件。DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
-
表示Make不存在时不会产生错误,例如在第一次编译时)。-include $(DEPFILES)
%.o: %.cpp Makefile
@$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
-MMD
生成使对象文件依赖于所包含的任何(非系统)头文件*.d
的Make规则。 -MP
添加了虚拟规则,可以避免在从源文件中删除头文件时出错。