让CMake明确选择MSVC平台工具集 P>嗨,我有个问题,我有一个C++项目,它使用的是MSVC编译器的选择C++ 11/14个特性,最多只能在CTPYNOV2013编译器工具集中出现。我知道有一个非常类似的主题,最相关的答案是,工具集不能从脚本中修改,因为最终用户会想要修改它 首先,我不同意工具集的选择是最终用户的特权(在开发库的情况下可能引用的人) 其次,我想完成的唯一一件事是,CMake检测是否存在各种编译器功能,以及它们是否缺失,并且平台是MSVC,然后根据MSVC的版本,CMake尝试将平台工具集更改为CTP版本。我知道一个事实,VS 12将不会收到任何更多的编译器更新(至少不会在CTPs中),因为从现在起这是VS 13 Beta版的特权,所以可以安全地假设MSVC版本1700(如果是对应于VS 12的版本)工具集可以使用脚本选择 第三,手动更新生成的VisualStudio项目文件通常会导致项目文件失效。如果源路径包含unicode字符(在我的例子中是这样的),那么cl.exe将无法找到它们。这是CMake的问题,与项目文件的字符编码和CMake写入路径的方式有关。对此我无能为力。项目文件必须准备充分,我只需要点击F7

让CMake明确选择MSVC平台工具集 P>嗨,我有个问题,我有一个C++项目,它使用的是MSVC编译器的选择C++ 11/14个特性,最多只能在CTPYNOV2013编译器工具集中出现。我知道有一个非常类似的主题,最相关的答案是,工具集不能从脚本中修改,因为最终用户会想要修改它 首先,我不同意工具集的选择是最终用户的特权(在开发库的情况下可能引用的人) 其次,我想完成的唯一一件事是,CMake检测是否存在各种编译器功能,以及它们是否缺失,并且平台是MSVC,然后根据MSVC的版本,CMake尝试将平台工具集更改为CTP版本。我知道一个事实,VS 12将不会收到任何更多的编译器更新(至少不会在CTPs中),因为从现在起这是VS 13 Beta版的特权,所以可以安全地假设MSVC版本1700(如果是对应于VS 12的版本)工具集可以使用脚本选择 第三,手动更新生成的VisualStudio项目文件通常会导致项目文件失效。如果源路径包含unicode字符(在我的例子中是这样的),那么cl.exe将无法找到它们。这是CMake的问题,与项目文件的字符编码和CMake写入路径的方式有关。对此我无能为力。项目文件必须准备充分,我只需要点击F7,c++,visual-studio-2012,cmake,nmake,C++,Visual Studio 2012,Cmake,Nmake,我已经找到了一种方法来实现我想要的命令 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

我已经找到了一种方法来实现我想要的命令

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位版本,但我希望在“最终用户”安装了CTP的情况下,对“最终用户”隐藏MSVC编译器的不可用性


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

使用@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()

您是否尝试使用-DCMAKE\u GENERATOR\u TOOLSET=“CTP\u Nov2013”-DCMAKE\u VS\u PLATFORM\u TOOLSET=“CTP\u Nov2013”运行它?谢谢您的提示。这很有效,确实让我的生活更轻松。然而,问题是如何从脚本中实现这一点。我可能已经添加了这一点,但我之所以想从脚本中这么做,是因为我还希望编写一个findxxx.cmake文件,这将取决于它是否能够修补工具集。现在,我最多只能检测用户是否按照您的建议在命令行上设置了这些变量,如果没有,则抛出错误。如果有一种方法可以在不使用多路径的情况下从脚本中执行此操作,那就太好了。