我有一个使用 log4cxx、boost 等库的项目,其标头会生成大量(重复)警告。有没有办法抑制来自库包含的警告(即#include <some-header.h>)或来自某些路径的包含?我想像往常一样在项目代码上使用 -Wall 和/或 -Wextra,而不会掩盖相关信息。我目前在 make 输出上使用 grep,但我想要更好的东西。
10 回答
您可以尝试使用-isystem
而不是包含库头文件-I
。这将使它们成为“系统标头”,并且 GCC 不会为它们报告警告。
对于使用 CMake 的用户,您可以修改include_directories
指令以包含SYSTEM
禁止针对此类标头发出警告的符号。
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
您可以使用编译指示。例如:
// 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
我找到了诀窍。对于库包含,而不是在 makefile中-Idir
使用。-isystem dir
然后,GCC 将 boost 等视为系统包含并忽略它们的任何警告。
#pragma
是给编译器的指令。您可以在#include 之前设置一些内容并在之后禁用它。
您也可以在命令行中执行此操作。
另一个专门针对禁用警告的 GCC 页面。
我会选择在源代码中使用#pragma's,然后提供一个 合理的理由(作为注释)来说明为什么要禁用警告。这意味着对头文件进行推理。
GCC 通过对警告类型进行分类来解决这个问题。您可以将它们分类为警告或忽略。之前链接的文章将向您展示哪些警告可能被禁用。
注意:您也可以通过使用属性来按摩源代码以防止某些警告;但是,这会将您与 GCC 紧密地联系在一起。
注意2:GCC 也使用微软编译器中使用的pop/push 接口——微软通过这个接口禁用警告。我建议您对此进行进一步调查,因为我不知道这是否可能。
您可以尝试使用预编译的标头。警告不会消失,但至少不会出现在您的主编译中。
如果您需要显式覆盖系统标头,那么您只能使用编译指示。您可以通过make depend
输出验证您正在使用哪些内容。
另请参阅gcc >= 4.6 的诊断推送
放以下
#pragma GCC system_header
将关闭此文件中所有以下代码的 GCC 警告。
另一种方法是在 makefile 中告诉编译器忽略特定文件夹的警告:
$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w
这些警告一定是有原因的。这些可能是由使用库的代码中的错误引起的,或者是由库代码本身的错误引起的。在第一种情况下,修复您的代码。在第二种情况下,要么停止使用该库,要么如果它是 FOSS 代码,请修复它。