首页 > 解决方案 > gcc -MDD 和 -isystem不会为“系统”路径添加依赖项

问题描述

所以我有以下设置(简化版):

application/app1.hpp
application/app1.cpp
application/utils/utils1.hpp
application/utils/utils1.cpp

因此,当我编译 app1.cpp 时,我会这样做(这是编译的精简版):

g++ -Wall -Wextra -Werror -I application -isystem application/utils -MMD -MP -MF dep.d -c application/app1.cpp -o obj.o

我使用 -MDD 自动生成依赖信息的地方。我使用 -isystem 来禁止来自 utils 文件夹中的文件的警告。

注意:这utils是一个子模块(即独立编译的单独项目)。因此,我不想从该项目编译警告/错误。因此我-isystem application/utils用来包含文件夹。当您使用 isystem 时,您不会收到 gcc 警告 - 这很好:)

但是我刚刚发现这也是我没有得到完整的依赖输出的原因。目录中包含的isystem文件不会作为依赖项添加到 gcc 生成的 dep.d 文件中。

因此,似乎我可以忽略来自 utils 的警告但不能为其生成依赖项,或者我可以获得依赖项输出但不能忽略警告。

我真的想要两个:

有可能以某种方式获得这两种行为吗?

我的一些想法:

标签: c++linuxgccgnu

解决方案


我刚刚发现了一些可行的方法,但我不确定它的效率如何。我找到了 -E gcc 选项,它仅用预处理替换了 -c (编译)。所以我可以这样做:

  1. 生成依赖信息:

    g++ -I application -I application/utils -E application/app1.cpp -o /dev/null -MMD -MP -MF dep.d

  2. 编译带有最少警告的文件:

    g++ -Wall -Wextra -Werror -I application -isystem application/utils -c application/app1.cpp -o obj.o

这将意味着预处理器运行两次 - 不确定这是多少工作......但与编译阶段相比,它似乎运行得相当快。

如果有进一步的想法,我仍然对他们非常开放......我暂时不会标记这个答案,以防有人有更好的想法......


推荐阅读