第 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 或 Developer Powershell 中运行 CMake。这可确保 CMake 能够访问所有必需的开发工具和环境变量。

CMake 生成器

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

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

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

注意

在 Windows 上,默认生成器通常是运行 CMake 的机器上可用的最新 Visual Studio 版本;在其他地方,默认生成器是 Unix Makefiles

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

单配置和多配置生成器

在许多情况下,可以将底层构建系统视为实现细节,而在使用 CMake 时不必区分 ninjamake。然而,有一个给定的生成器的重要属性是我们即使在最简单的流程中也需要注意的:它是否支持单配置构建,还是支持多配置构建。

软件构建通常有几个我们可能感兴趣的变体。这些变体具有诸如 DebugReleaseRelWithDebInfoMinSizeRel 等名称,其属性与给定变体的名称相对应。

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

注意

构建配置构建类型 是同义词。在处理仅支持单个变体的单配置生成器时,生成的变体通常称为“构建类型”。

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

然而,这个约定并非普遍适用。技术文档和口语化文档经常混淆这两个术语。在通用地涉及单配置和多配置生成器的上下文中,Configurationconfig 被认为是更正确的。

常用的生成器如下

单配置

多配置

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 将在此找到要构建的项目。它包含教程第 1 步将要讨论的根 CMakeLists.txt 文件。

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

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 将使用平台默认生成器,将 Step0 项目的构建系统生成到 Help/guide/tutorial/Step0/build 中。或者,我们可以指定一个特定的生成器,例如 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 Forums 联系我们。

有关 CMake 的专业培训,请参阅 CMake 培训登陆页面。有关其他专业的 CMake 服务,请通过我们的联系表单与我们联系