如何抑制库标题中的GCC警告?

如何抑制库标题中的GCC警告?,gcc,warnings,suppress-warnings,gcc-warning,Gcc,Warnings,Suppress Warnings,Gcc Warning,我有一个使用log4cxx、boost等库的项目,这些库的标题会生成大量(重复的)警告。是否有方法抑制来自库include(即#include)或特定路径的include的警告?我希望像往常一样在项目代码中使用-Wall和/或-Wextra,而不会混淆相关信息。我目前在生成输出时使用grep,但我希望使用更好的方法。您可以尝试使用。警告不会消失,但至少不会显示在主编译中。#pragma是编译器的指令。您可以在#include之前设置某些内容,然后禁用它 你也可以在家里做 另一个GCC页面专门介绍

我有一个使用log4cxx、boost等库的项目,这些库的标题会生成大量(重复的)警告。是否有方法抑制来自库include(即#include)或特定路径的include的警告?我希望像往常一样在项目代码中使用-Wall和/或-Wextra,而不会混淆相关信息。我目前在生成输出时使用grep,但我希望使用更好的方法。

您可以尝试使用。警告不会消失,但至少不会显示在主编译中。

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

你也可以在家里做

另一个GCC页面专门介绍

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

GCC通过警告类型来实现这一点。您可以将它们分类为警告或忽略。前面链接的文章将向您显示哪些警告可能被禁用

注意:您还可以使用按摩源代码来防止某些警告;然而,这将您与GCC紧密地联系在一起


注2:GCC还使用microsoft编译器中使用的-microsoft通过此接口禁用警告。我建议您对此进行进一步调查,因为我不知道这是否可能。

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

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

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

您可以使用pragmas。例如:

// 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
//保存诊断状态
#pragma GCC诊断推送
//关闭特定警告。也可以使用“-Wall”
#pragma GCC诊断已忽略“-已使用但已设置变量”
#包括
#包括
#包括
#包括
//重新打开警告
#pragma-GCC-diagnostic-pop

对于那些使用CMake的用户,您可以修改
include_目录
指令,以包含符号
系统
,该符号会抑制针对此类标题的警告

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

如果需要显式重写系统头,则只能使用pragmas。您可以通过
make depend
output验证您正在使用的内容

另请参见以下内容

#pragma GCC system_header

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

另一种方法是,在makefile中,告诉编译器忽略特定文件夹的警告:

$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w


+1给我一个好的建议:D但他在问如何做一些具体的事情:有些警告是不可能或很难修复的,特别是在第三方代码中,尤其是在Boost这样的元编程丰富的代码中。更糟糕的是,困扰我的是“c”的声明是“this”[-Werror=shadow]的一个成员”,在某些Boost头中很深很深。这当然不是问题,但它和类似的问题正在输出,使我很难在代码库中找到真正隐藏的实例。我考虑过pragmas,但如果我在包含头之前抑制警告,如何在#include之后将其设置回以前的状态?我希望看到项目代码的所有警告(已经帮了我几次),但是可以从命令行控制。这可能是个好主意。第三方包括:不要每天都改变。虽然我在Linux中没有太多使用它们,但它们在Visual Studio上工作得很好。不,除非您使用其他方法来抑制它们,否则它们仍然会出现在编译中(例如
-issystem
,但请记住在编译头和代码时都使用它)如果你想在XCODE中这样做,那么在你的目标构建设置中的“自定义编译器标志”中,将IS-系统路径插入到你的“其他C++标志”中。一个潜在的缺点是,在某些平台上,G++将自动包装任何系统标题在<代码>外“C”< /代码>中。如果代码< > >包含“<代码> >一个C++标题,在<代码> -ISCORE PATH中。+ 1帮助我用恼人的增强警告解决问题,为什么这比OP自己的答案多了1.5个小时?“其他C++标志“在我的目标生成设置中?有人能详细介绍一下这个解决方案吗?只在GCC>=4.6时可用。我喜欢push/pop pragmas的功能。我记得几年前就有类似java的东西,对C/C++感到沮丧/嫉妒。我喜欢在gcc的TrevorBoydSmith中提供这一功能,MS
cl
多年来也有这一功能。。。有时,
gcc
的适应速度有点慢。似乎您只能逐个禁用警告,即,
-Wall
不起作用。如果库提供了一个
${LIBFOO\u USE\u FILE}
变量,该变量将与CMake的命令一起使用,那么会发生什么?这几乎就是我问题的解决方案。我有1。)一个二进制目标,它依赖于2。)一个我自己编写的只有头的目标,它依赖于3。)一些外部库。我不知道如何只获取1和2的警告。你有什么想法吗?好像不行。我在一个使用
easylogging++
的项目中尝试了这一点,我从
easylogging++.h
中得到了同样大量的警告,尽管它所在的文件夹已包含在
SYSTEM
选项中。非常感谢。它救了我的命