如何从库头中隐藏GCC警告?


126

我有一个使用log4cxx,boost等库的项目,其标头会生成很多(重复)警告。有没有一种方法可以禁止来自库包含(例如#include <some-header.h>)或来自某些路径的包含的警告?我想在项目代码中照常使用-Wall和/或-Wextra,而不会模糊相关信息。我目前在make输出上使用grep,但是我想要更好的东西。

Answers:


127

您可以尝试使用-isystem代替来包含库头-I。这将使它们成为“系统标题”,而GCC不会为它们报告警告。


11
如果您尝试在XCode中执行此操作,则将-isystem路径插入目标构建设置中“自定义编译器标志”中的“其他C ++标志”。
马特·帕金斯

3
一个潜在的缺点是,在某些平台上,extern "C"如果您#include-isystem路径中使用C ++头文件,则g ++会自动在中包装任何系统头文件,从而导致有关C链接的奇怪错误。
塔维安·巴恩斯

1
+1帮助我解决了令人讨厌的增强警告stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom

3
为什么这比OP自己的答案要多得多,而OP自己的答案在1.5小时之前说的完全一样?
underscore_d

1
对于Xcode:如果目标构建设置中的“其他C ++标志”中没有文件夹路径,该怎么办?有人可以详细说明这个解决方案吗?
Ossir

107

对于使用CMake的用户,可以修改include_directories指令以包括SYSTEM禁止显示此类标题警告的符号。

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^

如果该库提供了${LIBFOO_USE_FILE}要与CMake的include()命令一起使用的变量,该怎么办?
waldyrious

2
这似乎几乎是解决我的问题的方法。我有1.)一个二进制目标,它取决于2.)我自己编写的仅标头目标,它取决于3.)一些外部库。我不知道如何只为1&2发出警告。你有什么主意吗
knedlsepp '16

2
似乎不起作用。我在使用了一个项目的情况下尝试了此操作,即使选项所在的文件夹中也包含easylogging++了同样的警告,easylogging++.h但仍会收到同样数量的警告SYSTEM
rbaleksandar

非常感谢。它使我脱离了警告页面。
Svalorzen

1
与已接受的答案相同的评论:这对我来说是不好的做法。
拉菲

55

您可以使用编译指示。例如:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop

3
仅适用于GCC> = 4.6的情况
Caduchon 2015年

1
我喜欢推送/流行编译功能。我记得几年前有类似Java的东西,对C / C ++感到沮丧/嫉妒。我爱这一点可用于gcc
Trevor Boyd Smith,

@TrevorBoydSmith女士cl也已经拥有多年的能力...有时gcc适应有点慢。
Alexis Wilke

29

我找到了窍门。对于库包含,而不是在makefile 中-Idir使用-isystem dir。然后,GCC将boost等视为系统包含的内容,并忽略其中的任何警告。


请注意,如果使用预编译头,则在编译头和代码时都需要添加标志。
user202729 '19

9

#pragma是对编译器的指令。您可以在#include之前设置某些内容,然后在#include之前将其禁用。

您也可以在命令行中执行此操作

另一个GCC页面专门关于禁用警告

我会选择在源代码中使用#pragma,然后提供您为什么禁用警告的 合理原因(作为注释)。这意味着要对头文件进行推理。

GCC通过警告类型进行分类来解决此问题。您可以将它们分类为警告或被忽略。先前链接的文章将向您显示可能禁用了哪些警告。

注意:您也可以使用属性按摩源代码以防止某些警告。但是,这使您与GCC紧密相关。

注意2:GCC还使用了Microsoft编译器中使用的pop / push接口 -Microsoft通过此接口禁用警告。我建议您进一步调查,因为我不知道是否有可能。


我考虑过编译指示,但是如果在包含标题之前禁止显示警告,如何在#include之后将其设置回先前的状态?我想查看项目代码的所有警告(已经帮助了我几次),但是可以从命令行进行控制。
AdSR

4

您可以尝试使用预编译头文件。警告不会消失,但至少不会出现在您的主编译中。


1
这实际上可能是一个好主意。第三方包含项每天都不会更改。
AdSR

究竟。尽管我在Linux中使用的并不多,但是它们在Visual Studio上运行得很好。
巴勃罗·圣克鲁斯

不,除非您使用其他方式禁止显示它们,否则它们仍将显示在编译中(例如-isystem,但请记住在编译标头和代码中都使用它)
user202729


1

将以下内容

#pragma GCC system_header

将关闭此文件中所有以下代码的GCC警告。


-9

这些警告一定有原因。这些可能是由使用该库的代码中的错误引起的,或是由库代码本身中的错误引起的。在第一种情况下,请修复您的代码。在第二种情况下,请停止使用该库,或者如果它是FOSS代码,请对其进行修复。


+1是好的建议:D,但他正在询问如何做一些特定的事情:D
Hassan Syed

4
有些警告是不可能的或很难解决的,尤其是在第三方代码中,尤其是在诸如Boost的元编程丰富的代码中。
ulidtko 2011年

3
越差一个是窃听我是“‘c’的阴影的声明‘这个’[-Werror =阴影]的成员”深,深在一些升压头。那当然不是问题,但是它和类似的问题正在涌出输出,这使我很难在我们的代码库中找到实例。
dmckee ---前主持人小猫,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.