包含或包含自动生成的依赖项?

时间:2012-10-12 21:09:16

标签: makefile g++

我喜欢使用g++ -MM功能来自动构建我的依赖项。我这样做的方式如下:

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

%.d: %.cxx
    @echo making dependencies for $<
    @g++ -MM $(CXXFLAGS) $< -o $@
    @sed -i 's,$*\.o,& $@ ,g' $@

基本上我可以给出这条规则ALLOBJ,它会:

  1. 将每个.o名称转换为.d名称,include将其转换为
  2. 当找不到.d时,它会从.cxx文件中创建它
    • %.d: %.cxx规则的最后一行会将.d文件的名称添加到文件本身,以便依赖项自动更新。
  3. 当我删除标题时出现问题:.d文件仍然希望找到它,并且当它不存在时make会感到沮丧。一种解决方案是用include替换-include,并在编译规则中构建依赖项。不幸的是,这需要每个编译规则的依赖关系生成行,并且还将忽略所有其他include错误(这似乎有风险)。是否有一些其他简单的方法来自动构建依赖项,以避免此问题?

2 个答案:

答案 0 :(得分:2)

重申我对the other question的回答,我是这样做的:

%.o: %.cpp
    @echo making $@ and dependencies for $< at the same time
    @$(CC) -MD -c $(CXXFLAGS) -o $@ $<
    @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 $@ and dependencies for $< at the same time
    @$(CC) -c $(CXXFLAGS) -o $@ $<
    @$(CC) -MM -MP $(CXXFLAGS) $< -o $*.d

-include *.d

所以现在我必须在我自己的makefile中修改%.o规则。从现在开始,我编译的所有东西中都会有一点@JackKelly,嘲笑我。哦,这是一个黑色的日子。

答案 1 :(得分:2)

阅读手册,感谢@jackKelly和@ Beta上面的回复,我找到了以下解决方案:

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

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

总结旗帜:

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

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