我刚从互联网上获取了一个随意的CMake项目,不确定如何编译它。我需要在命令行中运行哪些命令来构建它?
我刚从互联网上获取了一个随意的CMake项目,不确定如何编译它。我需要在命令行中运行哪些命令来构建它?
如果你使用的是像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进行内部构建,因为会遇到名称冲突的可能性以及清理所生成文件所涉及的困难。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>
的有效值包括Win32
、x64
、ARM
和ARM64
。如果未指定<TOOLSET>
,则将使用32位MSVC编译器。通常情况下,您会希望将其设置为host=x64
以确保使用64位MSVC,这可以为大型链接步骤分配更多内存。您还可以将<TOOLSET>
设置为ClangCL
以使用Visual Studio提供的ClangCL工具。CC
和CXX
分别用于C和C++编译器。如果它们为空,则会在PATH
中查找cc
和c++
可执行文件。您可以通过在CMake命令行上设置CMAKE_C_COMPILER
和CMAKE_CXX_COMPILER
CMake缓存(而不是环境)变量来手动覆盖编译器(再次使用-D
)。
$ cmake --install /path/to/build-dir --prefix /path/to/install-dir [--config Release]
当使用多配置生成器时,--config
是必需的。一旦安装到本地前缀,依赖它的项目可以通过将CMAKE_PREFIX_PATH
设置为/path/to/install-dir
来进行配置。