让 CMake 明确选择 MSVC 平台工具集

Posted

技术标签:

【中文标题】让 CMake 明确选择 MSVC 平台工具集【英文标题】:Have CMake select MSVC platform toolset explicitly 【发布时间】:2014-08-14 07:37:30 【问题描述】:

您好,我有一个问题,我有一个 C++ 项目,它使用精选的 C++11/14 功能,MSVC 编译器充其量仅存在于 CTP_Nov2013 编译器工具集中。我知道有一个非常相似的主题here,最相关的答案是不能从脚本中修改工具集,因为最终用户会想要修改它。

    首先,我不同意工具集的选择是最终用户的特权(在开发库的情况下可能指代的人)。 其次,我唯一想要完成的是 CMake 检测是否存在各种编译器功能,如果它们缺失,并且平台是 MSVC,那么根据 MSVC 的版本,CMake 会尝试更改平台工具集到 CTP 版本。我知道一个事实,VS 12 不会再收到任何编译器更新(至少不会在 CTP 中),因为这是 VS 13 Beta 从这里开始的特权,所以可以安全地假设 MSVC_VER 1700(如果是VS 12对应的版本)工具集可以使用脚本来选择。 第三,手动更新生成的 Visual Studio 项目文件通常会导致项目文件失效。不考虑一个一个地更改大约十几个目标的工具集是乏味的,如果源路径包含 unicode 字符(在我的例子中是这样),那么 cl.exe 将无法找到它们。这是 CMake 的问题,与项目文件的字符编码和 CMake 写入路径的方式有关。我对此无能为力。项目文件必须准备就绪,我只需按 F7。

我找到了一种通过命令实现我想要的方法

set(CMAKE_GENERATOR_TOOLSET "CTP_Nov2013" CACHE STRING "Platform Toolset" FORCE) 
set(CMAKE_VS_PLATFORM_TOOLSET "CTP_Nov2013" CACHE STRING "Platform Toolset" FORCE)

但是,这样做的问题是脚本需要运行两次才能生效。由于 cmake 命令行是使用

调用的
cmake -G"Visual Studio 12 2013 Win64"

已经选择了一个工具集,但我立即希望覆盖并入所选生成器的 x64 配置中的工具集。最终,用户像往常一样使用生成器规范从命令行选择 32/64 位构建,但我希望向“最终用户”隐藏 MSVC 编译器的功能,以防他/她安装了 CTP。

如何编写脚本并从命令行调用它,以便它适用于 Visual Studio 和 NMake Makefiles 生成器以及第一次调用 CMake?

【问题讨论】:

您是否尝试使用 -DCMAKE_GENERATOR_TOOLSET="CTP_Nov2013" -DCMAKE_VS_PLATFORM_TOOLSET="CTP_Nov2013" 运行它 感谢您的提示。这很好用,确实让我的生活更轻松。但是,问题是如何从脚本中执行此操作。我可能已经添加了这一点,但是我想从脚本中如此糟糕地执行此操作的原因是我还希望编写一个 FindXXXX.cmake 文件,该文件取决于它能够修补工具集。现在我最多只能检测用户是否按照您的建议在命令行上设置了这些变量,如果没有,则抛出错误。如果有一种方法可以在没有多通道的情况下从脚本中执行此操作,那就太好了。 使用脚本中的 -D 选项运行 cmake 【参考方案1】:

使用@Tanuki 的回复和set_target_properties,您可以在目标中强制使用平台工具集

if (CMAKE_VS_PLATFORM_TOOLSET MATCHES "CTP_Nov2013")
  set_target_properties($your_target
  PROPERTIES
  PLATFORM_TOOLSET "$CMAKE_VS_PLATFORM_TOOLSET")
endif()

【讨论】:

这没有任何作用。

以上是关于让 CMake 明确选择 MSVC 平台工具集的主要内容,如果未能解决你的问题,请参考以下文章

A quick introduction to CMake

跨平台开发工具CMake是如何做到让数百万公司爱不释手的?

编译工具链,生成各个平台的ffmpeg版本的库

错误 MSB8052:MSVC 工具集版本“14.28.29333”与“v120”平台工具集不兼容

CMAKE_GNUtoMS:将GNU格式库转换为MSVC格式

选择 MSVC 工具链