第 0 步:开始之前

CMake 教程包含编写和构建 C++ 项目的实践练习;解决日益复杂的构建需求,例如库、代码生成器、测试和外部依赖项。在我们准备开始这一旅程的第一步之前,我们需要确保手头有正确的工具,并了解如何使用它们。

注意

本教程假设用户拥有 C++20 编译器和工具链,并对 C++ 语言有入门级的了解。在此处列出所有可能获取这些先决条件的方法是不现实的。

此先决条件步骤提供了如何获取和运行 CMake 本身的建议,以便进行本教程的其余部分。如果您已经熟悉如何运行 CMake 的基础知识,可以随时跳过并继续进行后续教程。

获取教程练习

教程源代码示例可在 此压缩包 中找到。教程的每个步骤都有一个对应的子文件夹,它是该步骤练习的起点。

获取 CMake

获取 CMake 最直观的方法是从 CMake 网站下载它。网站的“下载”部分包含了适用于所有常见(以及一些不常见)桌面平台的最新 CMake 构建版本。

然而,最好通过您所在平台常用的开发者工具分发机制来获取 CMake。CMake 在大多数软件包存储库中均有提供,作为 Visual Studio 的一个组件,甚至可以从 Python 包索引中安装。此外,CMake 通常作为面向 C/C++ 的大多数 CI/CD 运行器基础镜像的一部分提供。您应该查阅您的软件构建环境文档,查看 CMake 是否已可用。

CMake 也可以使用 CMake 源码树根目录下的 README.rst 中描述的说明从源代码进行编译。

像任何程序一样,CMake 需要在 PATH 环境变量中可用,才能从 Shell 中运行。您可以通过运行任何 CMake 命令来验证 CMake 是否可用。

$ cmake --version
cmake version 3.23.5

CMake suite maintained and supported by Kitware (kitware.com/cmake).

注意

如果使用 Visual Studio 提供的开发环境,最好在“开发人员命令提示符”(Developer Command Prompt)或“开发人员 Powershell”(Developer Powershell)中运行 CMake。这可确保 CMake 有权访问所有必需的开发工具和环境变量。

CMake 生成器

CMake 是一个配置程序,有时被称为“元”构建系统。与其他配置系统一样,CMake 最终不负责运行生成软件构建的命令。相反,CMake 会根据项目、环境和用户提供的配置信息生成构建系统。

CMake 支持多种构建系统作为此配置过程的输出。这些输出后端被称为“生成器”,因为它们负责生成构建系统。CMake 支持许多生成器,相关文档可在 cmake-generators(7) 中找到。有关您的特定 CMake 安装所支持生成器的信息,可以通过 cmake --help 命令下的“Generators”标题查看。

因此,使用 CMake 需要提供一种能够使用该生成器输出的构建程序。Unix MakefilesNinjaVisual Studio 生成器分别需要兼容的 makeninjaVisual Studio 安装。

注意

Windows 上的默认生成器通常是机器上安装的最新 Visual Studio 版本,而在其他所有平台上则是 Unix Makefiles

可以使用 CMAKE_GENERATOR 环境变量或 cmake -G 选项来控制使用哪个生成器。

单配置和多配置生成器

在许多情况下,可以将底层构建系统视为实现细节,在使用 CMake 时无需区分(例如)ninjamake。然而,对于即使是简单的流程,我们也需要了解给定生成器的一个重要属性:它是否支持单配置构建,还是支持多配置构建。

软件构建通常有几个我们可能感兴趣的变体。这些变体名称如 DebugReleaseRelWithDebInfoMinSizeRel,具有对应于该变体名称的属性。

单配置构建系统总是以相同的方式构建软件,如果它被生成为产生 Debug 构建,它将始终产生 Debug 构建。多配置构建系统可以根据构建时指定的配置产生不同的输出。

注意

术语 **构建配置 (build configuration)** 和 **构建类型 (build type)** 是同义词。当处理仅支持单个变体的单配置生成器时,生成的变体通常被称为“构建类型”。

当处理多配置生成器时,可用的变体通常被称为“构建配置”。在构建时选择变体通常被称为“选择配置”,并被标志和变量称为“config”。

然而,这种约定并非通用的。技术文档和通俗文档经常混用这两个术语。在泛指单配置和多配置生成器的上下文中,*Configuration* 和 *config* 被认为更准确。

常用的生成器如下:

单配置

多配置

Ninja

Ninja Multi-Config

Unix Makefiles

Visual Studio (所有版本)

FASTBuild

Xcode

当使用单配置生成器时,构建类型根据 CMAKE_BUILD_TYPE 环境变量进行选择,或者可以在调用 CMake 时通过 cmake -DCMAKE_BUILD_TYPE=<config> 直接指定。

注意

对于本教程而言,在使用单配置生成器时,通常不需要指定构建类型。平台特定的默认行为适用于所有练习。

当使用多配置生成器时,构建配置在构建时指定,可以使用构建系统特定的机制,或者通过 cmake --build --config 选项指定。

其他使用基础

本教程的其余部分将更深入地涵盖其余的使用基础知识,但为了确保我们拥有一个可用的开发环境,这里将列出一些额外的 CMake 选项标志。

cmake -S <dir>

指定项目根目录,CMake 将在此处找到要构建的项目。该目录包含根 CMakeLists.txt 文件,这将在教程的第 1 步中讨论。

如果不指定,默认为当前工作目录。

cmake -B <dir>

指定构建目录,CMake 将在此输出生成构建系统的文件,以及运行构建系统时产生的构建产物。

如果不指定,默认为当前工作目录。

cmake --build <dir>

在指定的构建目录中运行构建系统。这是所有生成器的通用命令。对于多配置生成器,可以通过以下方式请求所需的配置:

cmake --build <dir> --config <cfg>

尝试一下

Help/guide/tutorial/Step0 目录包含一个简单的“Hello World”C++ 项目。CMake 如何配置该项目的细节将在教程的第 1 步中讨论,我们现在只需要关心如何运行 CMake 程序本身。

如上所述,根据我们想要用于构建的生成器,有许多运行 CMake 的可能方式。如果我们导航到 Help/guide/tutorial/Step0 目录并运行:

cmake -B build

CMake 将使用该平台的默认生成器,在 Help/guide/tutorial/Step0/build 中为 Step0 项目生成一个构建系统。或者,我们可以指定一个特定的生成器,例如 Ninja

cmake -G Ninja -B build

效果类似,但会使用 Ninja 生成器而不是平台默认值。

注意

我们不能在不同的生成器之间重用同一个构建目录。如果您想在相同的构建目录中使用不同的生成器,则必须在运行 CMake 之前删除旧的构建目录。

生成构建系统后,我们如何构建和运行项目取决于所使用的生成器类型。如果是非 Windows 平台上的单配置生成器,我们可以直接运行:

cmake --build build
./build/hello

注意

在 Windows 上,根据所使用的 Shell,我们可能需要指定文件扩展名,例如 ./build/hello.exe

如果我们使用多配置生成器,则需要指定构建配置。默认配置包括 DebugReleaseRelWithDebInfoMinRelSize。构建结果将存储在构建文件夹中特定于配置的子目录中。例如,我们可以运行:

cmake --build build --config Debug
./build/Debug/hello

获取帮助和其他资源

如需获得 CMake 社区的帮助,您可以在 CMake Discourse 论坛上提问。

有关 CMake 的专业培训,请参阅 CMake 培训主页。对于其他专业 CMake 服务,请使用我们的联系表单与我们联系