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.
我应该如何区分当前的发电机是否支持多种配置?
已编辑:添加了有关检查和更改的信息 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确实看到的更多详细信息:
CMAKE_CONFIGURATION_TYPESEnableLanguage()在cmGlobalVisualStudio7Generator.cxx中设置我看到您使用的是 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 美元,但我所指的部分位于示例章节中。
| 归档时间: |
|
| 查看次数: |
2975 次 |
| 最近记录: |