CMake 系列(六):切换构建类型

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 创建单独的构建目录,两者使用相同的源代码。这样,就可以在两者之间切换,而不用重新配置和编译。

系列导航


   转载规则


《CMake 系列(六):切换构建类型》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
CMake 系列(七):设置编译器选项 CMake 系列(七):设置编译器选项
前面的示例展示了如何探测 CMake,从而获得关于编译器的信息,以及如何切换项目中的编译器。本篇的任务是控制项目的编译器标志。CMake 为调整或扩展编译器标志提供了很大的灵活性,可以选择下面两种方法: CMake 将编译选项视为目标属性
2022-04-26
下一篇 
CMake 系列(五):指定编译器 CMake 系列(五):指定编译器
前面的示例中,我们还没有过多考虑如何选择编译器。CMake 可以根据平台和生成器选择编译器,还能将编译器标志设置为默认值。然而,我们通常希望能够控制编译器的选择。后面的示例中,我们还将考虑构建类型的选择,并展示如何控制编译器标志。 提示:
2022-04-12
  目录