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

Posted

技术标签:

【中文标题】MAKEFILE:将目标视为已更新而不修改文件【英文标题】:MAKEFILE: treating target as updated without modifying the file 【发布时间】:2015-08-18 16:43:19 【问题描述】:

如何让 GNU make 将目标视为已修改而不修改目标文件(无配方正文)?

我有一个包含另一个头文件的头文件。

程序.h:

//include guard    

#include "dependencies.h"

//some actual signatures

和生成文件:

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

在上面的示例中,当dependencies.h 仅更改dependencies.o 时重新编译而program.o 保持不变,因此构建可能会失败。是否可以改变这种行为?

谢谢。

阿列克

【问题讨论】:

您的问题一般类似于:***.com/questions/2394609/…。这是另一个例子:scottmcpeak.com/autodepend/autodepend.html 【参考方案1】:

更改这些行:

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 中。这样,您就不必对依赖项进行硬编码 - 让编译器为您解决!

【讨论】:

【参考方案2】:

让你的程序完全依赖它的依赖:

program.o: program.cpp program.h dependencies.h
  g++ -c program.cpp

这当然是因为您的program.o 实际上依赖于dependencies.h。如果dependencies.hprogram.h 的内部实现细节,那么您的代码应该可以正常编译和链接,而无需重新编译program.o

【讨论】:

我正在按照你说的那样做,但是如果有更多的链式依赖项(它们不是实现细节,而是签名 f.e. 的一部分),这会很乏味。我留下了这样的行:main.o: myWindows.h myViewModels.h iMyView.h model.h $(DALINCLUDEDIR)/$(DALHEADER) $(GUIINCLUDEDIR)/$(GUIHEADER) $(SERVERINCLUDEDIR)/$(SERVERHEADER) 那么也许 Barry 的自动化解决方案会有所帮助:)

以上是关于MAKEFILE:将目标视为已更新而不修改文件的主要内容,如果未能解决你的问题,请参考以下文章

Makefile——.PHONY

修改makefile,将wpa_cli编译成库

Makefile文件

24.touch命令

Makefile伪目标

项目部署Linux 环境下修改jar包内容避免完全更新整个包