Answers:
您可以尝试使用-isystem
代替来包含库头-I
。这将使它们成为“系统标题”,而GCC不会为它们报告警告。
extern "C"
如果您#include
在-isystem
路径中使用C ++头文件,则g ++会自动在中包装任何系统头文件,从而导致有关C链接的奇怪错误。
对于使用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
适应有点慢。
我找到了窍门。对于库包含,而不是在makefile 中-Idir
使用-isystem dir
。然后,GCC将boost等视为系统包含的内容,并忽略其中的任何警告。
#pragma
是对编译器的指令。您可以在#include之前设置某些内容,然后在#include之前将其禁用。
您也可以在命令行中执行此操作。
另一个GCC页面专门关于禁用警告。
我会选择在源代码中使用#pragma,然后提供您为什么禁用警告的 合理原因(作为注释)。这意味着要对头文件进行推理。
GCC通过对警告类型进行分类来解决此问题。您可以将它们分类为警告或被忽略。先前链接的文章将向您显示可能禁用了哪些警告。
注意:您也可以使用属性按摩源代码以防止某些警告。但是,这使您与GCC紧密相关。
注意2:GCC还使用了Microsoft编译器中使用的pop / push接口 -Microsoft通过此接口禁用警告。我建议您进一步调查,因为我不知道是否有可能。
如果需要显式覆盖系统标头,则只能使用编译指示。您可以通过make depend
输出验证正在使用的内容。
这些警告一定有原因。这些可能是由使用该库的代码中的错误引起的,或是由库代码本身中的错误引起的。在第一种情况下,请修复您的代码。在第二种情况下,请停止使用该库,或者如果它是FOSS代码,请对其进行修复。