c++ - CMake:隐藏 -WShadow 子目标的全局编译标志

标签 c++ gcc cmake protocol-buffers

背景: 我为所有子目标(我的项目中存在许多模块)设置了 -WShadow 编译标志。

现在,我正在将第三方库(谷歌的 protobuf 在某些地方有阴影代码)添加到项目树中。这个第三方库将是父项目下的 cmake 子目标。由于这个库在某些地方有阴影代码,全局 -WShadow 标志在我尝试构建时导致编译错误。

问题: 有什么办法可以隐藏 protobuf 目标的 -WShadow 标志? 我没有找到任何可以为 protobuf 目标的编译选项设置的 no shadow 标志。

最佳答案

当将第三方项目包含到您的 cmake 构建中时,使用 ExternalProject 会很有帮助而不是仅仅将他们的源代码树转储到您自己的源代码树中,然后 add_subdirectory-ing 它。 ExternalProject 将递归调用 cmake 并在其自己的范围内构建第三方项目。您可以根据需要明确地向它传播标志,但它避免了您当前遇到的情况,即您自己的构建范围内的内容“泄漏”到第三方构建系统中并导致意外行为。

本节here关于使用外部库提供了一个合理的例子。

要考虑的另一个选择是使用 find_package 而不是自己编译 Protobuf。这几乎总能减少麻烦。

另一种选择是使用 target_compile_options() 而不是全局 compile_options() 将标志添加到您自己的目标,从而避免将它们泄漏到默认标志列表中.然而,这有点脆弱。

关于c++ - CMake:隐藏 -WShadow 子目标的全局编译标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48761006/

相关文章:

c++ - STL 旋转 unique_ptr 的 const_iterators

c++ - 将类型转换应用于列表 : is "const" special?

cmake - 如何在CMake中设置警告级别?

opencv - 使用 Cmake 为 C++ 项目设置 Opencv 路径

c++ - 在 CMake/C++ 项目中高效地使用 SublimeText 和 SublimeClang

c++ - directx C++ 第一人称相机

c++ - 基对象作为接受派生对象的函数的参数

c# - 如何找到抛出 EETypeLoadException 的原因?

c++ - 混合单独编译的对象

gcc - 如何使用 GCC 强制构建 32 位 Boost?