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++ 编译器标志忽略外部库的警告但不包括目录的主要内容,如果未能解决你的问题,请参考以下文章