【发布时间】:2010-12-24 10:27:19
【问题描述】:
我有一个项目使用 log4cxx、boost 等库,其标头会产生大量(重复)警告。有没有办法抑制来自库包含的警告(即#include
【问题讨论】:
标签: gcc warnings suppress-warnings gcc-warning
我有一个项目使用 log4cxx、boost 等库,其标头会产生大量(重复)警告。有没有办法抑制来自库包含的警告(即#include
【问题讨论】:
标签: gcc warnings suppress-warnings gcc-warning
另一种方法是在 makefile 中告诉编译器忽略特定文件夹的警告:
$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w
【讨论】:
把下面的
#pragma GCC system_header
将关闭此文件中所有以下代码的 GCC 警告。
【讨论】:
我找到了诀窍。对于库包含,而不是 -Idir 在 makefile 中使用 -isystem dir。然后 GCC 将 boost 等视为系统包含并忽略它们的任何警告。
【讨论】:
如果您需要显式覆盖系统标头,则只能使用编译指示。您可以通过make depend 输出验证您正在使用的包括哪些内容。
【讨论】:
对于使用 CMake 的用户,您可以修改 include_directories 指令以包含符号 SYSTEM,该符号会禁止针对此类标头发出警告。
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
【讨论】:
${LIBFOO_USE_FILE} 变量以用于CMake 的include() 命令怎么办?
easylogging++ 的项目中尝试了这个,我从easylogging++.h 收到了同样大量的警告,即使它所在的文件夹已包含在SYSTEM 选项中。
您可以使用编译指示。例如:
// 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
cl 也有多年的能力......有时gcc 适应起来有点慢。
-Wall不起作用。见related question
您可以尝试使用-isystem 而不是-I 来包含库头。这将使它们成为“系统标头”,并且 GCC 不会为它们报告警告。
【讨论】:
extern "C" 中,如果您在#include -isystem 路径中使用 C++ 头文件,则会导致有关 C 链接的奇怪错误.
#pragma 是给编译器的指令。您可以在#include 之前设置一些内容并在之后禁用它。
您也可以通过command line 进行操作。
另一个 GCC 页面专门针对 disabling warnings。
我会选择在源代码中使用#pragma's,然后提供一个 合理理由(作为评论)您禁用警告的原因。这意味着对头文件进行推理。
GCC 通过classifying 警告类型来解决这个问题。您可以将它们分类为警告或忽略。之前链接的文章将向您展示哪些警告可能被禁用。
注意:您也可以使用attributes 按摩源代码以防止某些警告;但是,这会将您与 GCC 紧密地联系在一起。
注意2:GCC 也使用微软编译器中使用的pop/push interface——微软通过这个接口禁用警告。我建议您对此进行进一步调查,因为我不知道这是否可能。
【讨论】:
这些警告一定是有原因的。这些可能是由使用库的代码中的错误引起的,或者是由库代码本身的错误引起的。在第一种情况下,修复您的代码。第二种情况,要么停止使用该库,要么如果是 FOSS 代码,请修复它。
【讨论】:
您可以尝试使用precompiled headers。警告不会消失,但至少不会出现在您的主编译中。
【讨论】:
-isystem,但请记住在编译标头和代码中都使用它)