如何构建一个CMake项目?

12

我刚从互联网上获取了一个随意的CMake项目,不确定如何编译它。我需要在命令行中运行哪些命令来构建它?


1
这里在SO上大约有一百万个类似的问题变体,我找不到一个规范的重复。这是我尝试贡献这样一个规范问题/答案的努力。 - Alex Reinking
1
同意,我真的很喜欢这个问题,因为虽然有很多关于如何开始使用CMake的问题,但这些问题中许多都不是一个好的示例,不能作为更一般的入门问题的重复。 - drescherjm
1个回答

19

基本步骤

如果你使用的是像Linux或macOS这样的Unix-y操作系统,那么你需要运行以下命令:

$ 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 是包含根级 CMakeLists.txt 的目录,这通常是源代码控制库的根目录。同时,/path/to/build-dir 是一个独立的目录(可以还不存在),CMake将使用它来存储生成的构建系统及其输出。这称为外部构建。您不应该尝试使用CMake进行内部构建,因为会遇到名称冲突的可能性以及清理所生成文件所涉及的困难。
当使用单配置生成器(如在Unix上默认的Make)进行构建时,您通过在第一个命令中设置CMAKE_BUILD_TYPE变量来指定构建类型,也称为配置步骤。使用单配置生成器时,您必须始终设置此变量。内置的配置有DebugReleaseRelWithDebInfoMinSizeRel。详见这篇答案
在配置步骤之后,您可以通过调用底层构建工具(在这种情况下为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>的有效值包括Win32x64ARMARM64。如果未指定<TOOLSET>,则将使用32位MSVC编译器。通常情况下,您会希望将其设置为host=x64以确保使用64位MSVC,这可以为大型链接步骤分配更多内存。您还可以将<TOOLSET>设置为ClangCL以使用Visual Studio提供的ClangCL工具。
在所有生成器上,CMake会嗅探环境可用的编译器。它检查环境变量CCCXX分别用于C和C++编译器。如果它们为空,则会在PATH中查找ccc++可执行文件。您可以通过在CMake命令行上设置CMAKE_C_COMPILERCMAKE_CXX_COMPILERCMake缓存(而不是环境)变量来手动覆盖编译器(再次使用-D)。

安装和使用依赖项

一旦构建了CMake项目,您可以通过运行以下命令将其安装到系统范围或(最好)本地前缀:
$ cmake --install /path/to/build-dir --prefix /path/to/install-dir [--config Release]

当使用多配置生成器时,--config是必需的。一旦安装到本地前缀,依赖它的项目可以通过将CMAKE_PREFIX_PATH设置为/path/to/install-dir来进行配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接