gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:27:31 25 4
gpt4 key购买 nike

我喜欢使用 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 名称,并包含它,
  2. 当找不到 .d 时,它将从 .cxx 文件中创建它
    • %.d: %.cxx 规则的最后一行会将 .d 文件的名称添加到文件本身,这样依赖关系就会自动更新。

当我删除一个 header 时,问题就出现了:.d 文件仍然期望找到它,当它不存在时 make 会感到不安。一种解决方案是将 include 替换为 -include,并在编译规则中构建依赖项。不幸的是,这需要为每个编译规则生成依赖项行,并且还会忽略所有其他 include 错误(这似乎有风险)。是否有其他一些简单的方法来自动构建依赖项来避免这个问题?

最佳答案

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

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

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

总结标志:

  • -MM:构建依赖(而不是编译)
  • -MP:为所有 header 构建“虚拟”目标。这可以防止 make 在标题被删除并因此无法找到时提示。
  • -MT:指定规则的目标。这使我们可以告诉 .d 文件取决于 header ,而无需求助于丑陋的 sed 规则。

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

关于makefile - 要包含或包含自动生成的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12867144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com