2012-10-12 62 views
1

我喜欢使用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,它会:

  1. 转换每.o名称为.d名称,include它,
  2. 当它找不到.d时,它将从.cxx文件创建它
    • 的最后一行规则会将.d文件的名称添加到文件本身,以便自动更新依赖项。

产生的问题是,当我删除标题:在.d文件仍然希望能够找到它,并会得到开心,当它不存在。一种解决方案是用-include替换include,并在编译规则中构建依赖关系。不幸的是,这需要每个编译规则的依赖关系生成线,并且还会忽略所有其他include错误(这似乎有风险)。有没有其他简单的方法来自动构建依赖关系,从而避免此问题?

回答

2

阅读上述手动多一点,并感谢@jackKelly和@贝塔的反应,我发现了以下解决方案:

include $(ALLOBJ:%.o=%.d) 

%.d: %.cxx 
    @echo making dependencies for $< 
    @g++ -MM -MP -MT $*.d -MT $*.o $(CXXFLAGS) $< -o [email protected] 

总结国旗:

  • -MM:构建依赖关系(而不是编译)
  • -MP:为所有标题构建“虚拟”目标。这可以防止在标题被删除并因此无法找到时发出抱怨。
  • -MT:指定规则的目标。这使我们可以告诉使.d文件依赖于标头而不诉诸丑陋的sed规则。

我不相信我的解决方案比@ Beta的解决方案更正确。我倾向于在同一个makefile中为C++文件使用多个编译规则,因此对于所有这些文件,只有一个依赖关系规则比在每个编译规则中生成依赖关系稍微更清晰(在我的情况下)。

2

要重申我的回答对the other question,我做这种方式:

%.o: %.cpp 
    @echo making [email protected] and dependencies for $< at the same time 
    @$(CC) -MD -c $(CXXFLAGS) -o [email protected] $< 
    @cp $*.d $*.P 
    @sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
     -e '/^$$/ d' -e 's/$$/ :/' < $*.P >> $*.d 
    @rm $*.P 

-include $(ALLOBJ:%.o=%.d) 

编辑:

它......它产生依赖文件,但更干净和没有sed命令:

%.o: %.cpp 
    @echo making [email protected] and dependencies for $< at the same time 
    @$(CC) -c $(CXXFLAGS) -o [email protected] $< 
    @$(CC) -MM -MP $(CXXFLAGS) $< -o $*.d 

-include *.d 

所以现在我要修改我在自己的makefile的%.o规则。从现在开始,我会编辑,嘲笑我一些@JackKelly 。哦,这是一个黑色的日子。

+0

有两个问题:'-MD'做了什么?呃真的很长时间会发生什么? – Shep

+0

@Shep:'-MD'创建*两个*文件,'foo.o'和'foo.d'。但是这个'foo.d'列出了'foo.h'作为'foo.o'的前缀,所以它受到你描述的问题的影响。长'sed'命令修改'foo.d',将preq作为规则的目标而不需要命令(例如'foo.h:')。这足以安抚Make和防止错误; 'foo.h'丢失了,但是有一条规则,所以请相信所有的东西都会被照顾。 – Beta

+2

@Beta:你为什么不把'-MP'传递给'gcc'? –

相关问题