假设我在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
如下:
{{1}}
答案 0 :(得分:6)
如果
test.o
中有任何更改,是否会再次构建bar.h
否。 Make无法了解此依赖关系,也无法检查#include
中的更改。
当然,除非您将处理标头依赖关系留给知道的实体:编译器。 (假设在此示例中使用GCC和GNU。)
不要将标题列为依赖。
在项目中生成源文件列表。
SRCFILES := ...
为每个.d
生成一个依赖文件列表,一个SRCFILE
文件。
DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
将这些依赖项文件包含到您的Makefile中。 (前导-
表示如果不存在,Make将不会生成错误,例如在第一次编译时。)
-include $(DEPFILES)
使用通用规则,让编译器在编译每个源文件时生成一个头依赖项列表。
%.o: %.cpp Makefile
@$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
-MMD
生成Make规则,使目标文件依赖于包含的任何(非系统)头文件,名为*.d
。 -MP
添加了虚拟规则,可以避免在源文件中删除时出现错误。
答案 1 :(得分:3)
GCC(可能还有Clang)可以为你建立一个依赖列表;这样,您只需从源(cpp)文件中创建目标文件:
depend: .depend
.depend: $(SRC_FILES)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ -MF ./.depend;
include .depend
%.o: %.cpp
$(CC) $(CFLAGS) -c $<
您可能还会对makedepend
工具感兴趣。