我尝试在工具链文件中使用MSVC
和MSVC_VERSION
-
cmake的工具链-file.cmake
message (STATUS "Toolchain MSVC=${MSVC} MSVC_VERSION=${MSVC_VERSION}")
的CMakeLists.txt
message (STATUS "Project MSVC=${MSVC} MSVC_VERSION=${MSVC_VERSION}")
输出
> cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/cmake-toolchain-file.cmake
-- Toolchain MSVC= MSVC_VERSION=
-- Project MSVC=1 MSVC_VERSION=1800
-- Bulding target for: windows-x86
-- Configuring done
-- Generating done
-- Build files have been written to: D:/test/build
我从工具链文件中获取MSVC
和MSVC_VERSION
为空是否正常?
答案 0 :(得分:2)
我从工具链文件中获取MSVC和MSVC_VERSION为空是否正常?
是。在project
命令后初始化的变量。这也是工具链阅读的地方。尝试添加一些额外的消息:
cmake_minimum_required(VERSION 3.0)
message(STATUS "Before project: MSVC(${MSVC})")
project(Foo)
message(STATUS "After project: MSVC(${MSVC})")
结果:
-- Before project: MSVC()
-- Toolchain MSVC()
-- Toolchain MSVC()
...
-- After project: MSVC(1)
-- Configuring done
-- Generating done
所以我想你有一个隐藏的问题:
令人困惑吗?
是的,对于Visual Studio
生成器。因为通常你可以设置一些关键的东西,比如工具链中的编译器路径,所以在工具链处理之前,即在CMAKE_CXX_COMPILER_ID
命令之前读取与project
之类的编译器相关的变量是没有意义的。但是当您将生成器设置为Visual Studio
时,您的编译器始终为MSVC
。这为您提供了解决方法的提示。只需检查工具链中的CMAKE_GENERATOR
变量而不是MSVC_VERSION
(当然这对于NMake生成器不起作用):
if("${CMAKE_GENERATOR}" STREQUAL "Visual Studio 12 2013")
message("Toolchain: MSVC 1800")
endif()
if("${CMAKE_GENERATOR}" STREQUAL "Visual Studio 9 2008")
message("Toolchain: MSVC 1500")
endif()