我喜欢使用g++ -MM
功能来自动构建我的依赖关系。我这样做的方法如下:要包含或包含自动生成的依赖项?
include $(ALLOBJ:%.o=%.d)
%.d: %.cxx
@echo making dependencies for $<
@g++ -MM $(CXXFLAGS) $< -o [email protected]
@sed -i 's,$*\.o,& [email protected] ,g' [email protected]
基本上我可以给这个规则ALLOBJ
,它会:
- 转换每
.o
名称为.d
名称,include
它, - 当它找不到
.d
时,它将从.cxx
文件创建它- 的最后一行规则会将
.d
文件的名称添加到文件本身,以便自动更新依赖项。
- 的最后一行规则会将
产生的问题是,当我删除标题:在.d
文件仍然希望能够找到它,并会得到开心,当它不存在。一种解决方案是用-include
替换include
,并在编译规则中构建依赖关系。不幸的是,这需要每个编译规则的依赖关系生成线,并且还会忽略所有其他include
错误(这似乎有风险)。有没有其他简单的方法来自动构建依赖关系,从而避免此问题?
有两个问题:'-MD'做了什么?呃真的很长时间会发生什么? – Shep
@Shep:'-MD'创建*两个*文件,'foo.o'和'foo.d'。但是这个'foo.d'列出了'foo.h'作为'foo.o'的前缀,所以它受到你描述的问题的影响。长'sed'命令修改'foo.d',将preq作为规则的目标而不需要命令(例如'foo.h:')。这足以安抚Make和防止错误; 'foo.h'丢失了,但是有一条规则,所以请相信所有的东西都会被照顾。 – Beta
@Beta:你为什么不把'-MP'传递给'gcc'? –