如何在不修改目标文件(没有配方体)的情况下使GNU make将目标视为已修改?
我有头文件,其中包含另一个头文件。
program.h:
//include guard
#include "dependencies.h"
//some actual signatures
和makefile:
program: program.o dependencies.o
g++ -o program program.o dependencies.o
program.o: program.cpp program.h
g++ -c program.cpp
dependencies.o: dependencies.cpp dependencies.h
g++ -c dependencies.cpp
program.h: dependencies.h
# I would like that this target was treated as modified after
# dependencies.h changes
在上面的例子中,依赖关系.h只更改依赖关系。重新编译,使program.o不受影响,因此构建可能会失败。是否有可能改变这种行为?
感谢。
阿列克
答案 0 :(得分:4)
更改这些行:
program.o: program.cpp program.h
g++ -c program.cpp
dependencies.o: dependencies.cpp dependencies.h
g++ -c dependencies.cpp
成为:
OBJ_FILES = program.o dependencies.o
DEP_FILES = $(patsbust %.o,%.d,$(OBJ_FILES))
%.o : %.cpp
g++ -c $< -MP -MMD -MF $(@:.o=.d) -o $@
program : $(OBJ_FILES)
g++ -o $@ $^
-include $(DEP_FILES)
这将g++
为您自动生成您的依赖项文件(进入.d
)文件。这些文件将具有依赖项的makefile样式规则。在这种情况下,我期待:
program.o : dependencies.h
-include
会将这些内容添加到您的makefile中。这样,您就不必对依赖项进行硬编码 - 让编译器为您解决问题!
答案 1 :(得分:1)
让你的程序完全依赖于它的依赖:
program.o: program.cpp program.h dependencies.h
g++ -c program.cpp
这当然是因为program.o
实际上取决于dependencies.h
。如果dependencies.h
是program.h
的内部实现细节,那么您的代码应该编译并链接就好,而无需重新编译program.o
。