首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查生成器是否是CMakeLists.txt中的多配置生成器

如何检查生成器是否是CMakeLists.txt中的多配置生成器
EN

Stack Overflow用户
提问于 2015-07-27 19:05:43
回答 2查看 5K关注 0票数 5

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

我用以下文件进行了测试

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.6)

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

project(foo)

像这样叫它

代码语言:javascript
复制
mkdir build
cd build
cmake -G "Visual Studio 12 2013" ..

得到了Single-configuration generator

如何区分当前生成器是否支持多个配置?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-27 20:08:39

编辑的:添加关于检查和更改CMAKE_CONFIGURATION_TYPES的信息

检查和更改CMAKE_CONFIGURATION_TYPES

根据这个问题的建议,您可以检查和更改CMAKE_CONFIGURATION_TYPES,但是要注意,在CMake 3.2.2中有一个错误类型,它破坏了最初生成和解决方案生成时的这种行为(用CMake 3.3.0修正):

代码语言:javascript
复制
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的建议):

代码语言:javascript
复制
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.cmakefindCUDA.cmake )可能依赖于对于单个配置环境来说CMAKE_CONFIGURATION_TYPES是空的(再次感谢@Tsyvarev的提示)。

因此,更好的解决方案是为所有受支持的生成器添加工具链文件。它们通常是有用的,因为在那里您可以处理所有工具链/生成器特定的部分。

这是我的VSToolchain.txt的摘录

代码语言:javascript
复制
# 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()命令之后移动检查:

代码语言:javascript
复制
project(foo)

message("CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES}")

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

我得到了VS2013:

代码语言:javascript
复制
CMAKE_CONFIGURATION_TYPES Debug;Release;MinSizeRel;RelWithDebInfo
Multi-configuration generator

对于GCC来说:

代码语言:javascript
复制
CMAKE_CONFIGURATION_TYPES
Single-configuration generator

有关CMake看到的更多信息,请参见:

票数 5
EN

Stack Overflow用户

发布于 2022-08-31 23:14:22

我看到你在CMake v2.6上,但是对于任何在v3.9+上的人来说,v3.9介绍了GENERATOR_IS_MULTI_CONFIG

在多配置生成器上为真的只读属性。

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

代码语言:javascript
复制
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)

这种方法在克雷格·斯科特的“专业CMake”中是推荐的,并解释了其他方法的缺点--特别是涉及CMAKE_CONFIGURATION_TYPES的方法。这本书是30美元,但我所指的章节是样本章节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31661264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档