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

时间:2019-01-15 15:30:40

标签: c++ linux gcc gnu

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

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警告-很棒:)

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

所以看来我可以忽略utils的警告,但不能获得依赖生成的信息,或者我可以获取依赖项输出,但不能忽略警告。

我真的想要两个:

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

是否有可能以某种方式获得两种行为?

我的一些想法:

  • 我正在考虑以某种方式首先运行依赖预处理器部分,然后再进行编译...但是我没有找到一种方法来实现
  • 强制在MMD部分包含文件夹。我发现可以在-include中包含特定文件,但不能包含文件夹,并且我没有文件列表:(

1 个答案:

答案 0 :(得分:0)

我刚刚发现了一些可行的方法,但是我不确定它的效率如何。我发现-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

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

如果还有其他想法,我仍然非常乐于接受...如果有人有更好的想法,我将暂时不回答这个答案...