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)像这样叫它
mkdir build
cd build
cmake -G "Visual Studio 12 2013" ..得到了Single-configuration generator。
如何区分当前生成器是否支持多个配置?
发布于 2015-07-27 20:08:39
编辑的:添加关于检查和更改CMAKE_CONFIGURATION_TYPES的信息
检查和更改CMAKE_CONFIGURATION_TYPES
根据这个问题的建议,您可以检查和更改CMAKE_CONFIGURATION_TYPES,但是要注意,在CMake 3.2.2中有一个错误类型,它破坏了最初生成和解决方案生成时的这种行为(用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)预置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)没有一个多配置环境会忽略它。但是要注意,其他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 "")CMAKE_WIN32_EXECUTABLE只是为了显示我在Visual工具链文件中放置了什么样的设置。
这里提出了另一种CMake命令行解决方案:如何在没有调试符号和没有优化的情况下创建cmake构建配置?
只检查CMAKE_CONFIGURATION_TYPES
如果您只想检查CMake在CMAKE_CONFIGURATION_TYPES中设置了什么
我刚刚用Visual 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()我得到了VS2013:
CMAKE_CONFIGURATION_TYPES Debug;Release;MinSizeRel;RelWithDebInfo
Multi-configuration generator对于GCC来说:
CMAKE_CONFIGURATION_TYPES
Single-configuration generator有关CMake看到的更多信息,请参见:
CMAKE_CONFIGURATION_TYPES由EnableLanguage()在cmGlobalVisualStudio7Generator.cxx中设置发布于 2022-08-31 23:14:22
我看到你在CMake v2.6上,但是对于任何在v3.9+上的人来说,v3.9介绍了GENERATOR_IS_MULTI_CONFIG
在多配置生成器上为真的只读属性。
可以将值加载到CMake变量中,如下所示:
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)这种方法在克雷格·斯科特的“专业CMake”中是推荐的,并解释了其他方法的缺点--特别是涉及CMAKE_CONFIGURATION_TYPES的方法。这本书是30美元,但我所指的章节是样本章节。
https://stackoverflow.com/questions/31661264
复制相似问题