Visual Studio的Cmake生成器不设置CMAKE_CONFIGURATION_TYPES

Flo*_*ogo 3 cmake visual-studio

CMake的常见问题其他 地方 建议检查CMAKE_CONFIGURATION_TYPES识别多配置生成.我发现了几个不起作用的问题(比如这个问题).问题似乎是变量未在第一次调用cmake时设置.

我测试了以下文件

cmake_minimum_required(VERSION 2.6)

if(CMAKE_CONFIGURATION_TYPES)
    message("Multi-configuration generator")
else()
    message("Single-configuration generator")
endif()

project(foo)
Run Code Online (Sandbox Code Playgroud)

并称它为这样

mkdir build
cd build
cmake -G "Visual Studio 12 2013" ..
Run Code Online (Sandbox Code Playgroud)

并得到了Single-configuration generator.

我应该如何区分当前的发电机是否支持多种配置?

Flo*_*ian 6

已编辑:添加了有关检查和更改的信息 CMAKE_CONFIGURATION_TYPES

检查和更改 CMAKE_CONFIGURATION_TYPES

根据这个问题的建议你可以检查和更改CMAKE_CONFIGURATION_TYPES,但要注意有一个错误0015577:'project'命令覆盖 CMake 3.2.2中的CMAKE_CONFIGURATION_TYPES,它确实破坏了初始VS解决方案生成的这种行为(用CMake 3.3修复) .0):

cmake_minimum_required(VERSION 3.3)

project(foo NONE)

if(CMAKE_CONFIGURATION_TYPES)
    message("Multi-configuration generator")
    set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "My multi config types" FORCE)
else()
    message("Single-configuration generator")
endif()

enable_language(C CXX)
Run Code Online (Sandbox Code Playgroud)

预置 CMAKE_CONFIGURATION_TYPES

如果您只需要为多配置环境配置一组配置(感谢@Tsyvarev提供的建议):

cmake_minimum_required(VERSION 2.8)

# NOTE: Only used in multi-configuration environments
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "My multi config types" FORCE)

project(foo)
Run Code Online (Sandbox Code Playgroud)

没有多配置环境会忽略它.但要知道,其他CMake的模块,如findBoost.cmake,findCUDA.cmake可以依靠CMAKE_CONFIGURATION_TYPES为空单的配置环境(再次感谢您的提示@Tsyvarev).

因此,更好的解决方案是为所有支持的生成器添加工具链文件.它们通常很有用,因为您可以处理所有工具链/发电机特定部件.

这是我的摘录VSToolchain.txt:

# Reduce the config types to only Debug and Release
SET(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE)

# Standard is a console app. If you need a windows app, use WIN32 define in add_executable
set(CMAKE_WIN32_EXECUTABLE 0 CACHE INTERNAL "")
Run Code Online (Sandbox Code Playgroud)

CMAKE_WIN32_EXECUTABLE 是在那里显示我在Visual Studio工具链文件中放置了什么样的设置.

这里建议使用另一个CMake命令行解决方案:如何创建没有调试符号且没有优化的cmake构建配置?

只检查 CMAKE_CONFIGURATION_TYPES

如果您只想查看CMake所设置的内容CMAKE_CONFIGURATION_TYPES:

我刚刚使用Visual Studio 2013和MinGW/GCC(都有空build目录)测试了上面的代码.您只需要一个小的更改并在project()命令后移动检查:

project(foo)

message("CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES}")

if(CMAKE_CONFIGURATION_TYPES)
    message("Multi-configuration generator")
else()
    message("Single-configuration generator")
endif()
Run Code Online (Sandbox Code Playgroud)

我得到了VS2013:

CMAKE_CONFIGURATION_TYPES Debug;Release;MinSizeRel;RelWithDebInfo
Multi-configuration generator
Run Code Online (Sandbox Code Playgroud)

而对于GCC:

CMAKE_CONFIGURATION_TYPES
Single-configuration generator
Run Code Online (Sandbox Code Playgroud)

有关CMake确实看到的更多详细信息:


sta*_*all 5

我看到您使用的是 CMake v2.6,但对于使用 v3.9+ 的任何人来说,v3.9 引入了名为 的全局属性GENERATOR_IS_MULTI_CONFIG

只读属性,在多配置生成器上适用。

您可以将该值加载到 CMake 变量中,如下所示:

get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
Run Code Online (Sandbox Code Playgroud)

Craig Scott在“Professional CMake”中推荐了这种方法,并解释了其他方法的缺点 - 特别是那些涉及CMAKE_CONFIGURATION_TYPES. 这本书售价 30 美元,但我所指的部分位于示例章节中。