【问题标题】:How to hide warnings in compilation from external libraries如何从外部库隐藏编译中的警告
【发布时间】:2017-02-21 18:00:58
【问题描述】:

我有一个只有以下代码的 main.cpp 文件:

#include <iostream>
#include "include/rapi/RApi.h"

using namespace std;

int main() {
    std::cout << "Test\n";
    return 0;
}

当我编译时,我希望看到来自我的代码的警告,而不是来自外部包含文件的警告。我过去已经能够做到这一点,但我可能在编译标志中遗漏了一些东西,因为当我不想看到它们时,我不断地从包含的头文件中看到错误。

这是我的编译命令:

g++ -isystem include -pedantic -Wall -Wextra main.cpp -o main.o

我想查看 main.cpp 中的警告和错误,而不是 include 文件夹中的文件。

我试过-isysteminclude-isysteminclude/rapi,将-isystem 传递到标志的末尾,但无济于事。

我错过了什么吗?

【问题讨论】:

  • 您是否尝试使用 &lt;&gt; 代替?这些用于系统标题。
  • @tuple_cat 据我所知,你不能只是改变它。 适用于系统头文件,而不适用于与项目其余部分位于同一文件夹中的文件。
  • 你为什么不能呢?我的意思是#include &lt;RApi.h&gt;。如果我将其更改为使用",我会从该文件中收到警告。我从来没有听说过你不能把系统头文件和项目的其他部分放在同一个文件夹中,并且在 g++ 手册中没有找到任何这样的说法。
  • 我认为您需要将-isystem include 添加到您的编译行,然后在您的源文件中使用#include "rapi/RApi.h"(而不是include)。 -isystem 选项仅适用于使用该搜索路径找到的标头,但如果您 #include "include/rapi/RApi.h" 则没有使用搜索路径,它直接包含标头。
  • "" vs &lt;&gt; 的使用并没有真正的意义。这完全取决于编译器实现有什么区别(标准没有说明它)。大多数编译器都实现了它,因此如果您使用"",那么编译器首先在当前目录中查找,然后在-I 和默认位置给出的任何目录中查找,如果您使用&lt;&gt;,那么它只在-I 中查找和系统目录,而不是当前目录(除非你使用-I. 或其他东西)。

标签: c++ c++11 makefile compilation


【解决方案1】:

您需要将-isystem include 添加到您的编译行,然后在您的代码中使用:

#include "rapi/RApi.h"

(不是include/rapi/RApi.h)。 -isystem 选项仅将“系统标头”属性应用于使用该搜索路径查找的文件。如果将完整路径放在#include 中,那么 GCC 会直接查找路径并且不使用-isystem 路径,因此不会应用“系统头”属性。

关于使用&lt;&gt;"",行为上的确切差异本质上是实现定义的。不用猜,看各种SO问答,比如this one

【讨论】:

    【解决方案2】:
    #include <iostream>
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wall"
    #include "include/rapi/RApi.h"
    #pragma GCC diagnostic pop
    
    int main() {
      std::cout << "Test\n";
      return 0;
    }
    

    【讨论】:

    • 我并不是说这不起作用,但我宁愿有一个不需要我对 N 个文件进行此破解的解决方案,其中 N 是有问题的标头所在的文件数包括在内。
    • 如何制作自己的标头,将 GCC 指令放入其中,然后包含 rapi
    • 顺便说一句 - 做 -wall -werror 的超级荣誉,真正的忍者会这样做。 -pedantic 当然会让你进入超级忍者模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多