带有 -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 属性?