CMake 可以配置构建类型,例如 Debug、Release 等。配置时,可以为 Debug 或 Release 构建设置相关的选项或属性,例如编译器和链接器标志。控制生成构建系统使用的配置变量是 CMAKE_BUILD_TYPE。该变量默认为空,CMake 识别的值为:
Debug:用于在没有优化的情况下,使用带有调试符号构建库或可执行文件;Release:用于构建优化的库或可执行文件,不包含调试符号;RelWithDebInfo:用于构建较少优化的库或可执行文件,包含调试符号;MinSizeRel:用于以不增加目标代码大小的优化方式,来构建库或可执行文件。
提示:本示例包含一个 C++/C 示例,在 CMake 3.5 或更高版本中有效,并已在 GNU/Linux、macOS 和 Windows 上测试通过。
具体实施
示例中,我们将展示如何为项目设置构建类型。
首先,定义最低 CMake 版本、项目名称和支持的语言:
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-07 LANGUAGES C CXX)
然后,设置一个默认的构建类型(本例中是 Release),并打印一条消息。要注意的是,该变量被设置为缓存变量,可以通过缓存进行编辑:
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
最后,打印出 CMake 设置的相应编译标志:
message(STATUS "C flags, Debug configuration: ${CMAKE_C_FLAGS_DEBUG}")
message(STATUS "C flags, Release configuration: ${CMAKE_C_FLAGS_RELEASE}")
message(STATUS "C flags, Release configuration with Debug info: ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
message(STATUS "C flags, minimal Release configuration: ${CMAKE_C_FLAGS_MINSIZEREL}")
message(STATUS "C++ flags, Debug configuration: ${CMAKE_CXX_FLAGS_DEBUG}")
message(STATUS "C++ flags, Release configuration: ${CMAKE_CXX_FLAGS_RELEASE}")
message(STATUS "C++ flags, Release configuration with Debug info: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message(STATUS "C++ flags, minimal Release configuration: ${CMAKE_CXX_FLAGS_MINSIZEREL}")
验证配置的输出:
$ mkdir -p build
$ cd build
$ cmake ..
...
-- Build type: Release
-- C flags, Debug configuration: -g
-- C flags, Release configuration: -O3 -DNDEBUG
-- C flags, Release configuration with Debug info: -O2 -g -DNDEBUG
-- C flags, minimal Release configuration: -Os -DNDEBUG
-- C++ flags, Debug configuration: -g
-- C++ flags, Release configuration: -O3 -DNDEBUG
-- C++ flags, Release configuration with Debug info: -O2 -g -DNDEBUG
-- C++ flags, minimal Release configuration: -Os -DNDEBUG
切换构建类型:
$ cmake -D CMAKE_BUILD_TYPE=Debug ..
-- Build type: Debug
-- C flags, Debug configuration: -g
-- C flags, Release configuration: -O3 -DNDEBUG
-- C flags, Release configuration with Debug info: -O2 -g -DNDEBUG
-- C flags, minimal Release configuration: -Os -DNDEBUG
-- C++ flags, Debug configuration: -g
-- C++ flags, Release configuration: -O3 -DNDEBUG
-- C++ flags, Release configuration with Debug info: -O2 -g -DNDEBUG
-- C++ flags, minimal Release configuration: -Os -DNDEBUG
工作原理
我们演示了如何设置默认构建类型,以及如何(从命令行)覆盖它。这样,就可以控制项目是使用优化,还是关闭优化启用调试。我们还看到了不同配置使用了哪些标志,这主要取决于选择的编译器。需要在运行 CMake 时显式地打印标志,也可以仔细阅读 cmake --system-information 的输出,以了解当前平台、默认编译器和语言的默认组合是什么。下一篇示例中,我们将讨论如何为不同的编译器和不同的构建类型,扩展或调整编译器标志。
更多信息
我们展示了如何使用变量 CMAKE_BUILD_TYPE 来切换生成构建系统的配置。在 Release 和 Debug 配置中构建项目通常很有用,例如:评估编译器优化级别的效果。对于单配置生成器,如 Unix Makefile、MSYS Makefile 或 Ninja,因为要对项目重新配置,需要运行 CMake 两次。不过,CMake 也支持复合配置生成器。这些通常是集成开发环境提供的项目文件,最显著的是 Visual Studio 和 Xcode,它们可以同时处理多个配置。可以使用 CMAKE_CONFIGURATION_TYPES 变量对这些生成器的可用配置类型进行调整,该变量接受一个值列表。
下面是对 Visual Studio 的 CMake 调用:
$ mkdir -p build
$ cd build
$ cmake .. -G"Visual Studio 12 2017 Win64" -D CMAKE_CONFIGURATION_TYPES="Release;Debug"
将为 Release 和 Debug 配置生成一个构建树。然后,可以使用 --config 标志来决定构建这两个中的哪一个:
$ cmake --build . --config Release
注意:当使用单配置生成器开发代码时,为 Release 版和 Debug 创建单独的构建目录,两者使用相同的源代码。这样,就可以在两者之间切换,而不用重新配置和编译。