带有 -isystem<include_path> 的 gcc -MDD 不会为“系统”路径添加依赖项

Posted

技术标签:

【中文标题】带有 -isystem<include_path> 的 gcc -MDD 不会为“系统”路径添加依赖项【英文标题】:gcc -MDD with -isystem<include_path> wont add dependencies for "system" paths 【发布时间】:2019-01-15 15:30:40 【问题描述】:

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

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 的警告但不能为其生成依赖项,或者我可以获得依赖项输出但不能忽略警告。

我真的想要两个:

实用程序没有警告 utils 文件夹中的依赖项(通过 gcc 的 -MMD)

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

我的一些想法:

我正在考虑以某种方式先运行依赖关系预处理器部分,然后再进行编译...但我没有看到这样做的方法 在 MMD 部分中强制包含文件夹。我发现我可以用-include 包含特定文件,但不能包含文件夹,而且我没有文件列表:(

【问题讨论】:

您最终会遇到一些可移植性问题。 -isystem 行为在不同的操作系统上会超载很多。不久前,我遇到了一个 BSD(也许是 OpenBSD?),其中所有 -isystem 标头都自动包装在 extern "C" 块中。这对 Boost 来说是个问题。 是的,请注意这个:***.com/questions/9775583/… @ZanLynx 感谢您的提醒 :) 。目前我很高兴我们的环境是受控的(仅限 ubuntu linux)用于构建。 【参考方案1】:

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

    生成依赖信息:

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

    以最少的警告编译文件:

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

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

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

【讨论】:

以上是关于带有 -isystem<include_path> 的 gcc -MDD 不会为“系统”路径添加依赖项的主要内容,如果未能解决你的问题,请参考以下文章

将 Action<T> 回调指定为带有 xml 的数据,可能带有 cref 属性?

带有数组的for循环

为啥在 /groups/ 的 NoReverseMatch 中显示带有符号 '<' 的 '<groups'

带有条件的Vue循环,如PHP

带有空格的 solr 查询

两个带有json键的数组[重复]