我有一个项目使用log4cxx,boost等库,其头文件会生成大量(重复)警告。有没有办法抑制来自库包含的警告(即#include< some-header.h>)或包含某些路径?我希望像往常一样在项目代码中使用-Wall和/或-Wextra而不会隐藏相关信息。我目前在make输出上使用grep但我想要更好的东西。
答案 0 :(得分:111)
您可以尝试使用-isystem
而不是-I
来包含库标题。这将使他们成为“系统标题”,而GCC将不会为他们报告警告。
答案 1 :(得分:87)
对于那些使用CMake的人,您可以修改include_directories
指令以包含符号SYSTEM
,该符号会禁止针对此类标题发出警告。
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
答案 2 :(得分:46)
您可以使用编译指示。例如:
// 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
答案 3 :(得分:22)
我找到了诀窍。对于库包含,而不是-Idir
在makefile中使用-isystem dir
。 GCC然后处理提升等因为系统包含并忽略来自它们的任何警告。
答案 4 :(得分:8)
#pragma
是编译器的指令。你可以在#include之前设置一些东西并在之后禁用它。
您也可以在command line。
执行此操作另一个专门针对disabling warnings的GCC页面。
我会选择在源代码中使用#pragma,然后提供 声音原因(作为注释)说明您禁用警告的原因。这将意味着关于头文件的推理。
GCC通过classifying警告类型对此进行处理。您可以将它们分类为警告或被忽略。之前链接的文章将向您显示可能禁用的警告。
注意:您也可以使用attributes按摩源代码以防止出现某些警告;但是,这与GCC非常接近。
注2:GCC还使用了microsoft编译器中使用的pop/push interface - Microsoft通过此接口禁用警告。我建议你进一步调查,因为我不知道它是否可能。
答案 5 :(得分:4)
您可以尝试使用precompiled headers。警告不会消失,但至少不会出现在主编辑中。
答案 6 :(得分:1)
如果您需要显式覆盖系统标题,那么您将被限制为pragma。您可以通过make depend
输出验证您使用的内容。
答案 7 :(得分:0)
放入以下内容
#pragma GCC system_header
将关闭此文件中所有以下代码的GCC警告。
答案 8 :(得分:0)
另一种方法是,在 makefile 中,告诉编译器忽略特定文件夹的警告:
$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w
答案 9 :(得分:-7)
这些警告必须有原因。这些要么是由使用库的代码中的错误引起的,要么是由库代码本身中的错误引起的。在第一种情况下,修复您的代码。在第二种情况下,要么停止使用库,要么是FOSS代码,修复它。