c++ - 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 的警告但不能为其生成依赖项,或者我可以获得依赖项输出但不能忽略警告。
我真的想要两个:
- 没有来自 utils 的警告
- 来自 utils 文件夹的依赖项(通过 gcc 的 -MMD)
有可能以某种方式获得这两种行为吗?
我的一些想法:
- 我正在考虑以某种方式先自行运行依赖预处理器部分,然后再进行编译......但我没有看到这样做的方法
- 强制在 MMD 部分中包含文件夹。我发现我可以包含特定文件
-include
但不能包含文件夹,而且我没有文件列表:(
解决方案
我刚刚发现了一些可行的方法,但我不确定它的效率如何。我找到了 -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
这将意味着预处理器运行两次 - 不确定这是多少工作......但与编译阶段相比,它似乎运行得相当快。
如果有进一步的想法,我仍然对他们非常开放......我暂时不会标记这个答案,以防有人有更好的想法......
推荐阅读
- flutter - 谷歌助手打开 Flutter 应用时运行命令
- node.js - 如何通过用户名和密码保护环回资源管理器?
- python - 拆分存储在数组中的字符串值
- json - jq 在每个 json 对象之前跳过初始无效字符串并打印所选列
- java - 线程安全构建器模式
- c++ - 在 Visual Studio 2019 项目中静态链接 SDL-2 的问题
- java - 为什么我得到 java.lang.ArithmeticException: 除以零
- sql - 查询以在 IMPALA 中一起显示所有列、表和模式名称
- mysql - Docker 数据库容器未获取现有数据库中的数据
- android - 如何在 min API 21 下更改启动图标大小