152

我有一个使用 log4cxx、boost 等库的项目,其标头会生成大量(重复)警告。有没有办法抑制来自库包含的警告(即#include <some-header.h>)或来自某些路径的包含?我想像往常一样在项目代码上使用 -Wall 和/或 -Wextra,而不会掩盖相关信息。我目前在 make 输出上使用 grep,但我想要更好的东西。

4

10 回答 10

139

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

于 2009-12-14T12:12:09.983 回答
133

对于使用 CMake 的用户,您可以修改include_directories指令以包含SYSTEM禁止针对此类标头发出警告的符号。

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
于 2014-10-10T10:54:47.197 回答
62

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

// 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
于 2012-11-21T11:46:40.560 回答
30

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

于 2009-12-14T10:39:34.337 回答
9

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

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

另一个专门针对禁用警告的 GCC 页面。

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

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

注意:您也可以通过使用属性来按摩源代码以防止某些警告;但是,这会将您与 GCC 紧密地联系在一起。

注意2:GCC 也使用微软编译器中使用的pop/push 接口——微软通过这个接口禁用警告。我建议您对此进行进一步调查,因为我不知道这是否可能。

于 2009-12-08T13:46:12.770 回答
4

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

于 2009-12-08T13:46:05.513 回答
2

如果您需要显式覆盖系统标头,那么您只能使用编译指示。您可以通过make depend输出验证您正在使用哪些内容。

另请参阅gcc >= 4.6 的诊断推送

于 2015-02-09T14:17:16.247 回答
2

放以下

#pragma GCC system_header

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

于 2019-07-04T12:15:17.967 回答
0

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

$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w
于 2021-02-03T10:28:54.307 回答
-9

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

于 2009-12-08T13:48:43.373 回答