CMake:隐藏-Windows子目标的全局编译标志

时间:2018-02-13 06:49:45

标签: c++ gcc cmake protocol-buffers

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

现在,我正在添加第三方库(Google的protobuf,它在某些地方隐藏了代码)到项目树中。父项目下的第三方库将是 cmake 子目标。由于此库在某些地方隐藏了代码,因此当我尝试构建时,全局-WShadow标志会导致编译错误。

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

1 个答案:

答案 0 :(得分:2)

将第三方项目纳入cmake版本时,使用ExternalProject会有所帮助,而不仅仅是将源代码树转储到您自己的add_subdirectory中。 ExternalProject将递归调用cmake并在其自己的范围内构建第三方项目。你可以根据需要明确地将标志传播给它,但是它避免了你现在拥有的场景,你自己的构建范围内的东西"泄漏"进入第三方构建系统并导致不良行为。

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

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

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