背景:
我为所有子目标(我的项目中存在许多模块)设置了 -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/