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
,RelWithDebInfo
和MinSizeRel
. 有关此问题的更多详细信息,请参见此答案。
在配置步骤之后,您可以通过调用底层构建工具(在本例中为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 Win32
、x64
、ARM
和的有效值ARM64
。如果<TOOLSET>
未指定,则将使用 32 位 MSVC 编译器。通常,您会希望host=x64
确保使用 64 位 MSVC,这可以为大型链接步骤分配更多内存。您还可以设置<TOOLSET>
为ClangCL
使用 Visual Studio 提供的 ClangCL 工具。
在所有生成器上,CMake 会嗅探要使用的编译器的环境。它分别检查 C 和 C++ 编译器的CC
和CXX
环境变量。cc
如果这些为空,它将c++
在PATH
. 您可以通过在 CMake 命令行(再次使用)设置CMAKE_C_COMPILER
和CMAKE_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
.
推荐阅读
- jenkins - Artifactory 中的 conan 包 buildInfo 缺少元数据
- github - Github 操作在作业之间共享工作区/工件?
- reactjs - Reactjs:子功能组件必须引用“全局”数组
- excel - 在两张纸之间使用索引,在vba中匹配?
- swift - ViewController 不显示视图
- jq - 如何在jq中执行`or`?
- c# - 窗口形式的树视图中的 AutoResize 属性
- android-studio - android studio中的依赖错误= com.android.support:appcompat-v7:29.+
- sql-server - 在预期条件的上下文中指定的非布尔类型的表达式,靠近“WHEN”
- python - 如何在根据日期计算数据框中的斜率时提高性能