第 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 Makefiles、Ninja 和 Visual Studio 生成器分别需要兼容的 make、ninja 和 Visual Studio 安装。
注意
Windows 上的默认生成器通常是机器上安装的最新 Visual Studio 版本,而在其他所有平台上则是 Unix Makefiles。
可以使用 CMAKE_GENERATOR 环境变量或 cmake -G 选项来控制使用哪个生成器。
单配置和多配置生成器¶
在许多情况下,可以将底层构建系统视为实现细节,在使用 CMake 时无需区分(例如)ninja 和 make。然而,对于即使是简单的流程,我们也需要了解给定生成器的一个重要属性:它是否支持单配置构建,还是支持多配置构建。
软件构建通常有几个我们可能感兴趣的变体。这些变体名称如 Debug、Release、RelWithDebInfo 和 MinSizeRel,具有对应于该变体名称的属性。
单配置构建系统总是以相同的方式构建软件,如果它被生成为产生 Debug 构建,它将始终产生 Debug 构建。多配置构建系统可以根据构建时指定的配置产生不同的输出。
注意
术语 **构建配置 (build configuration)** 和 **构建类型 (build type)** 是同义词。当处理仅支持单个变体的单配置生成器时,生成的变体通常被称为“构建类型”。
当处理多配置生成器时,可用的变体通常被称为“构建配置”。在构建时选择变体通常被称为“选择配置”,并被标志和变量称为“config”。
然而,这种约定并非通用的。技术文档和通俗文档经常混用这两个术语。在泛指单配置和多配置生成器的上下文中,*Configuration* 和 *config* 被认为更准确。
常用的生成器如下:
单配置 |
多配置 |
|---|---|
Visual Studio (所有版本) |
|
当使用单配置生成器时,构建类型根据 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
如果我们使用多配置生成器,则需要指定构建配置。默认配置包括 Debug、Release、RelWithDebInfo 和 MinRelSize。构建结果将存储在构建文件夹中特定于配置的子目录中。例如,我们可以运行:
cmake --build build --config Debug
./build/Debug/hello
获取帮助和其他资源¶
如需获得 CMake 社区的帮助,您可以在 CMake Discourse 论坛上提问。
有关 CMake 的专业培训,请参阅 CMake 培训主页。对于其他专业 CMake 服务,请使用我们的联系表单与我们联系。