嗨,我有一个问题,我有一个C++项目,该项目使用select C++ 11/14功能,这些功能最多只能在CTP_Nov2013编译器工具集中提供,而对于MSVC编译器而言。我知道有一个非常相似的主题here,并且最相关的答案是该工具集一定不能从脚本中进行修改,因为最终用户将希望对其进行修改。

  • 首先,我不同意工具集的选择是最终用户的特权(在开发中的库中可能指的是家庭用户)。
  • 其次,我要完成的唯一事情是CMake会检测是否存在各种编译器功能,如果缺少这些功能,并且平台是MSVC,则取决于MSVC的版本,CMake会尝试将平台工具集更改为CTP版本。我知道一个事实,VS 12将不再接受任何编译器更新(至少在CTP中不这样),因为从现在开始这是VS 13 Beta的特权,因此可以安全地假设MSVC_VER 1700(如果是与VS 12)工具集相对应的版本,可以使用该脚本进行选择。
  • 第三,手动更新生成的Visual Studio项目文件通常会导致项目文件失效。如果源路径包含unicode字符(在我的案例中是这样做的),则不要一一更改大约12个目标的工具集是很乏味的,那么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位版本,但是如果他/她安装了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()
    

    07-28 01:26