CMake:隐藏子目标的-WShadow全局编译标志
Posted
技术标签:
【中文标题】CMake:隐藏子目标的-WShadow全局编译标志【英文标题】:CMake: Hide -WShadow global compile flag for child target 【发布时间】:2018-02-13 06:49:45 【问题描述】:背景:
我为所有子目标(我的项目中存在许多模块)设置了-WShadow
编译标志。
现在,我正在将第三方库(Google 的 protobuf,在某些地方隐藏了代码)添加到项目树中。此第三方库将是父项目下的 cmake 子目标。由于这个库在某些地方隐藏了代码,所以当我尝试构建时,全局-WShadow
标志会导致编译错误。
问题:
有什么办法可以隐藏 protobuf 目标的 -WShadow
标志吗?
我没有找到任何可以为 protobuf 目标的编译选项设置的 no shadow 标志。
【问题讨论】:
I don't find any no shadow flag which I can set for protobuf target's compile options.
- 根据gcc documentation,这意味着对于每个-W..
选项都有一个-Wno-...
对,具有相反的效果。或者你问你应该在哪里添加-Wno-shadow
标志?
【参考方案1】:
在您的 cmake
构建中包含第三方项目时,使用 ExternalProject 而不是将其源代码树转储到您自己的源代码树中并 add_subdirectory
-ing 它会很有帮助。 ExternalProject 将递归调用 cmake 并在自己的范围内构建第三方项目。您可以根据需要向其显式传播标志,但它避免了您当前的情况,即您自己的构建范围内的东西“泄漏”到第三方构建系统并导致不良行为。
here 关于使用外部库的部分提供了一个合理的示例。
另一个需要考虑的选项是使用find_package
,而不是自己编译 Protobuf。这几乎总是不那么麻烦。
另一种选择是使用target_compile_options()
而不是全局compile_options()
将标志添加到您自己的目标中,这样可以避免将它们泄漏到默认标志列表中。然而,这有点脆弱。
【讨论】:
我 猜 提问者已将-Wshadow
标志放入 CMAKE_CXX_FLAGS 变量中(我发现此变量适合此类 check-我的代码 标志)。尽管compile_options
命令是有范围的(可以在子目录中发出),但CMAKE_*_FLAGS
变量始终是全局的。我同意ExternalProject
是处理此类情况的正确方法。但正如您所描述的 compile_options
和 target_compile_options
之间的区别,CMAKE_CXX_FLAGS
变量的描述也可能有用。以上是关于CMake:隐藏子目标的-WShadow全局编译标志的主要内容,如果未能解决你的问题,请参考以下文章