我喜欢使用g++ -MM
功能来自动构建我的依赖项。我这样做的方式如下:
include $(ALLOBJ:%.o=%.d)
%.d: %.cxx
@echo making dependencies for $<
@g++ -MM $(CXXFLAGS) $< -o $@
@sed -i 's,$*\.o,& $@ ,g' $@
基本上我可以给出这条规则ALLOBJ
,它会:
.o
名称转换为.d
名称,include
将其转换为.d
时,它会从.cxx
文件中创建它
%.d: %.cxx
规则的最后一行会将.d
文件的名称添加到文件本身,以便依赖项自动更新。 当我删除标题时出现问题:.d
文件仍然希望找到它,并且当它不存在时make会感到沮丧。一种解决方案是用include
替换-include
,并在编译规则中构建依赖项。不幸的是,这需要每个编译规则的依赖关系生成行,并且还将忽略所有其他include
错误(这似乎有风险)。是否有一些其他简单的方法来自动构建依赖项,以避免此问题?
答案 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)
阅读g++手册,感谢@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 ++文件使用多个编译规则,因此对于所有这些文件,只有一个依赖关系规则比在每个编译规则中生成依赖关系更简洁(在我的情况下)。