我有一个项目使用了log4cxx、boost等库,其头文件会产生大量(重复的)警告信息。是否有一种方法可以抑制来自库包含的警告(例如#include <some-header.h>),或者抑制来自特定路径的包含?我希望像往常一样在项目代码上使用-Wall和/或-Wextra,而不会隐藏相关信息。目前我使用make输出中的grep,但我希望有更好的解决方案。
我有一个项目使用了log4cxx、boost等库,其头文件会产生大量(重复的)警告信息。是否有一种方法可以抑制来自库包含的警告(例如#include <some-header.h>),或者抑制来自特定路径的包含?我希望像往常一样在项目代码上使用-Wall和/或-Wextra,而不会隐藏相关信息。目前我使用make输出中的grep,但我希望有更好的解决方案。
如果您使用CMake,可以修改include_directories
指令以包括符号SYSTEM
,从而抑制对此类头文件的警告。
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
你可以尝试使用-isystem
而非-I
来包含库头文件。这将使它们成为“系统头文件”,GCC不会为它们报告警告。
extern "C"
包装起来,如果你在-isystem
路径下#include
一个C++头文件,就会出现关于C链接的奇怪错误。 - Tavian Barnes// 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
gcc
中也有了这个功能。 - Trevor Boyd Smithcl
已经有这个功能多年了... 有时候gcc
适应得有点慢。 - Alexis Wilke我发现了一个诀窍。对于库的包含,不要使用-Idir
,而是在makefile中使用-isystem dir
。GCC将boost等库视为系统包含文件,并忽略它们造成的任何警告。
#pragma
是给编译器的指令。你可以在 #include 前设置一些内容,然后在后面禁用它。
你也可以在命令行上这样做。
GCC还有另一页专门介绍禁用警告。
我会选择在源代码中使用 #pragma,并提供一个合理的理由(作为注释)来解释为什么要禁用这些警告。这意味着需要对头文件进行推理。
GCC通过分类警告类型来处理这个问题。你可以将它们分类为警告或忽略。前面链接的文章会向你展示哪些警告可以被禁用。
注意:你也可以使用属性调整源代码以防止某些警告;但是,这会使你与GCC联系得更紧密。
注意2:GCC也使用微软编译器中使用的pop/push接口,微软通过这个接口禁用警告。我建议您进一步调查此事,因为我不知道是否可能。#pragma GCC system_header
这将关闭本文件中所有后续代码的GCC警告。
-isystem
,但要记得在编译头文件和代码时都使用它),否则它们仍会显示在编译中。 - user202729$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w
这些警告肯定有原因。它们可能是由于你使用库的代码中存在错误,也可能是由于库本身存在错误。如果是前者,就修复你的代码。如果是后者,要么停止使用该库,要么如果它是FOSS代码,则修复它。
${LIBFOO_USE_FILE}
变量,该如何在CMake的include()命令中使用? - waldyrious