MAKEFILE:将目标更新为更新而不修改文件

时间:2015-08-18 16:43:20

标签: c++ c makefile

如何在不修改目标文件(没有配方体)的情况下使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不受影响,因此构建可能会失败。是否有可能改变这种行为?

感谢。

阿列克

2 个答案:

答案 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.hprogram.h的内部实现细节,那么您的代码应该编译并链接就好,而无需重新编译program.o