首页 > 解决方案 > 如何构建 CMake 项目?

问题描述

我刚刚从互联网上获得了一个任意的 CMake 项目,但我不知道如何编译它。我需要运行哪些命令才能从命令行构建它?

标签: cmake

解决方案


基本步骤

如果您使用的是 Unix-y 操作系统,例如 Linux 或 macOS,那么您将运行:

$ cmake -DCMAKE_BUILD_TYPE=Release -S /path/to/source-dir -B /path/to/build-dir
$ cmake --build /path/to/build-dir

这里,/path/to/source-dir是包含 root-level 的目录CMakeLists.txt,这通常是源代码控制存储库的根目录。同时,/path/to/build-dir是一个不同的目录(还不需要存在),CMake 将使用它来存储生成的构建系统及其输出。这称为树外构建。您永远不应尝试使用 CMake进行树内构建,因为名称冲突的可能性以及清理生成的文件所涉及的困难。

当使用单一配置生成器(如 Make,这是 Unix 上的默认生成器)构建时,您可以通过CMAKE_BUILD_TYPE在第一个命令中设置变量来指定构建类型,称为配置步骤。使用单一配置生成器时,您必须始终设置此变量。内置配置是Debug, Release,RelWithDebInfoMinSizeRel. 有关此问题的更多详细信息,请参见此答案。

在配置步骤之后,您可以通过调用底层构建工具(在本例中为make)或调用 CMake 的通用构建启动器命令 ( cmake --build) 来构建项目,就像我在这里所做的那样。

如果您在 Windows 上,则默认生成器是 Visual Studio,它是一个多配置生成器。这意味着在构建步骤而不是配置步骤中选择构建类型,并且必须相应地调整命令:

$ cmake -S /path/to/source-dir -B /path/to/build-dir
$ cmake --build /path/to/build-dir --config Release

这些步骤假定您正在查看的 CMake 构建表现良好。如果项目无法通过上述步骤构建,并且您已将其所有依赖项安装到系统位置(并且它们表现良好),那么您应该打开上游项目的问题。在成熟的 CMake 构建中,最常见的不良行为来源是依赖处理。您经常需要阅读构建或其文档来确定需要设置哪些变量(通过-D,就像我们在CMAKE_BUILD_TYPE上面所做的那样),以便项目找到它的依赖项。

高级主题

设置选项和缓存变量

一些项目提供启用/禁用测试、组件、功能等的选项。这些通常通过在配置步骤中将条目写入CMake 缓存来完成。例如,禁用构建测试的常用方法是在命令行中设置BUILD_TESTING为:NO

$ cmake -S /path/to/source-dir -B /path/to/binary-dir [...] -DBUILD_TESTING=NO

这个特定的变量是一个约定,但不能保证被遵守。检查项目的文档以查看可用的选项。

选择生成器和工具链

当专门使用Visual Studio生成器时,您可以告诉 CMake 您希望针对哪个平台以及您希望使用哪个版本的编译器。为此,CMake 配置命令的完整形式是:

$ cmake -G "Visual Studio 16 2019" -A <ARCH> -T<TOOLSET> [...]

<ARCH>include Win32x64ARM和的有效值ARM64。如果<TOOLSET>未指定,则将使用 32 位 MSVC 编译器。通常,您会希望host=x64确保使用 64 位 MSVC,这可以为大型链接步骤分配更多内存。您还可以设置<TOOLSET>ClangCL使用 Visual Studio 提供的 ClangCL 工具。

在所有生成器上,CMake 会嗅探要使用的编译器的环境。它分别检查 C 和 C++ 编译器的CCCXX 环境变量。cc如果这些为空,它将c++PATH. 您可以通过在 CMake 命令行(再次使用)设置CMAKE_C_COMPILERCMAKE_CXX_COMPILER CMake 缓存(不是环境)变量来手动覆盖编译器。-D

安装和使用依赖

构建 CMake 项目后,您可以在系统范围内或(最好)通过运行以下命令将其安装到本地前缀:

$ cmake --install /path/to/build-dir --prefix /path/to/install-dir [--config Release]

--config仅当使用多配置生成器时才需要where 。一旦安装到本地前缀,依赖它的项目可以通过设置CMAKE_PREFIX_PATH/path/to/install-dir.


推荐阅读