gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:54 29 4
gpt4 key购买 nike

你好,我有一个问题,我有一个 C++ 项目使用了 MSVC 编译器的精选 C++11/14 功能,这些功能最多只存在于 CTP_Nov2013 编译器工具集中。我知道有一个非常相似的话题 here ,并且最相关的答案是不得从脚本中修改工具集,因为最终用户会想要修改它。

  1. 首先,我不同意工具集的选择是最终用户的特权(如果库正在开发中,则可能指的是任何人)。
  2. 其次,我唯一想完成的是 CMake 检测是否存在各种编译器功能,如果缺少这些功能,并且平台是 MSVC,则 CMake 会根据 MSVC 的版本尝试更改平台工具集到 CTP 版本。我知道一个事实,即 VS 12 不会收到任何更多的编译器更新(至少不会在 CTP 中),因为从现在开始这是 VS 13 Beta 的特权,因此可以安全地假设 MSVC_VER 1700(如果那是VS 12对应的版本)可以使用脚本选择工具集。
  3. 第三,手动更新生成的 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?

最佳答案

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

关于c++ - 让 CMake 明确选择 MSVC 平台工具集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302502/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com