变量在工具链文件中是空的

时间:2015-06-30 20:05:34

标签: visual-c++ cmake toolchain

我尝试在工具链文件中使用MSVCMSVC_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

我从工具链文件中获取MSVCMSVC_VERSION为空是否正常?

1 个答案:

答案 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()