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.h
是program.h
的内部实现细节,那么您的代码应该可以正常编译和链接,而无需重新编译program.o
。
【讨论】:
我正在按照你说的那样做,但是如果有更多的链式依赖项(它们不是实现细节,而是签名 f.e. 的一部分),这会很乏味。我留下了这样的行:main.o: myWindows.h myViewModels.h iMyView.h model.h $(DALINCLUDEDIR)/$(DALHEADER) $(GUIINCLUDEDIR)/$(GUIHEADER) $(SERVERINCLUDEDIR)/$(SERVERHEADER)
那么也许 Barry 的自动化解决方案会有所帮助:)以上是关于MAKEFILE:将目标视为已更新而不修改文件的主要内容,如果未能解决你的问题,请参考以下文章