如何从库头压缩GCC警告?

我有一个使用log4cxx,boost等库的项目,这些库的头文件会生成很多(重复的)警告。 有没有一种方法来压制库中的警告(即#include <some-header.h>)或包含某些path? 我想在项目代码上像往常一样使用-Wall和/或-Wextra,而相关信息不被遮盖。 我目前使用grep做输出,但我想要更好的东西。

您可以尝试使用-isystem而不是-I来包含库头。 这将使他们“系统标题”和海合会不会报告他们的警告。

对于那些使用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 

我find了诀窍。 对于库包含,而不是-Idir在makefile中使用-isystem目录 。 GCC然后对待助推等系统包括并忽略来自他们的任何警告。

#pragma是编译器的指令。 你可以在#include之前设置一些东西,然后禁用它。

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

另一个GCC页面,专门关于禁用警告 。

我会select在源代码中使用#pragma,然后提供正确的理由(作为注释),说明为什么要禁用警告。 这将意味着头文件的推理。

GCC通过分类警告types来解决这个问题。 您可以将它们分类为警告或被忽略。 以前链接的文章将告诉你哪些警告可能被禁用。

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

注2:GCC也使用microsoft编译器中使用的pop / push接口 –Microsoft通过此接口禁用警告。 我build议你进一步调查,因为我不知道这是否可能。

你可以尝试使用预编译头文件 。 警告不会消失,但至less不会显示在您的主要编译中。

如果您需要显式覆盖系统标题,那么您只能使用编译指示。 你可以通过make depend输出来validation你正在使用哪一个。

另请参阅诊断push-pop for gcc> = 4.6

这些警告必须有理由。 这些将由使用该库的代码中的错误引起,或由库代码本身中的错误引起。 在第一种情况下,修复你的代码。 在第二种情况下,停止使用库或者如果它是FOSS代码,请修复它。