C++ 编译器标志忽略外部库的警告但不包括目录

Posted

技术标签:

【中文标题】C++ 编译器标志忽略外部库的警告但不包括目录【英文标题】:C++ compiler flag to ignore warnings for external libraries but without including directory 【发布时间】:2017-10-26 03:49:23 【问题描述】:

据我所知,有两种方法可以忽略外部库的警告。

第一种方法是使用#pragma:

#pragma gcc diagnostic ignored "-Wunused-parameter"

第二种方法是将-isystem/path/to/system/lib 添加到编译器标志中。这会将特定包含路径标记为外部包含路径,因此编译器不会发出来自这些包含的警告。

我有一个包含许多编译目标的大型项目,其中一些使用特定的第三方库,这会导致我的编译器出现问题。由于某些原因,我不能使用 #pragma 选项。

但是,如果我将-isystem 用作所有构建目标的一揽子编译器标志,那么不幸的是,我将为所有其他构建目标包含/path/to/system/lib,即使是那些不使用该系统库的目标。这意味着其他目标将搜索那些外部库,这是不可取的。

是否有编译器选项,类似于-isystem,可以一揽子方式添加,不会添加到搜索路径,但仅在路径恰好已经存在时排除警告包含在搜索路径中?

【问题讨论】:

【参考方案1】:

我有一个包含许多编译目标的大型项目,其中一些使用特定的第三方库,这会导致我的编译器出现问题。由于某些原因,我不能使用 #pragma 选项。

你能详细说明一下吗?为什么带有#pragma GCC diagnostic 的包装头不是一个选项?也就是说,像这样:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#include </path/to/real/include.h>
#pragma GCC diagnostic pop

(或者,如果您想变得花哨,请使用#include_next。)您只会在跨越子系统边界时应用它;子系统本身将使用-Wunused-parameter 编译。

我在 GCC/libcpp 源代码中没有看到任何允许在不添加新系统头文件的情况下重置系统头文件标志的内容。在任何情况下,这在我看来都是可以在构建系统中合理解决的问题。

【讨论】:

我在组织中使用现有代码库,并且必须服从高级代码审查员,他们指定我不能使用 pragma 解决方案。 我可以做一些复杂的 CMake 魔法来正确设置 -isystem 仅针对相关目标,但这将是一个比拥有一个完全符合我需要的标志更耗时的解决方案。不过,我几乎完成了繁琐的 CMake 巫术,所以如果没有这样的标志应该没问题...

以上是关于C++ 编译器标志忽略外部库的警告但不包括目录的主要内容,如果未能解决你的问题,请参考以下文章

杂项讨论

在 C++ 共享库的标头中声明“外部“C””有啥影响?

C++:禁用隐式转换警告

Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误

对外部库的编译器依赖路径的组织

如何抑制有关 C++ 中未使用变量的警告?