2.CMake的入门准备

在计算机上获取以及安装CMake

在使用 CMake 之前,您需要在系统上安装或构建 CMake 二进制文件。在许多系统上,您可能会发现 CMake 已经安装或可以使用系统的标准包管理器工具进行安装。Cygwin、Debian、FreeBSD、OS X MacPorts、Mac OS X Fink 和许多其他系统都有 CMake 发行版。
如果您的系统没有 CMake 包,您可以在 CMake 下载页面上找到为许多常见架构预编译的 CMake。选择所需的版本并按照下载说明进行操作。CMake 可以安装到任何目录,因此安装不需要 root 权限
如果您没有为您的系统找到预编译的二进制文件,那么您可以从源代码构建 CMake。要构建 CMake,您将需要一个现代 C++ 编译器和来自 CMake 下载页面或 Kitware 的 GitLab 实例的源代码分发。要构建 CMake,请按照Readme.txt源代码树顶部的说明进行操作。

目录结构

CMake 在构建项目时使用两个主要目录:源目录和二进制目录。源目录是项目的源代码所在的位置。这也是找到 CMakeLists 文件的地方。二进制目录有时称为构建目录,CMake 将在其中放置生成的目标文件、库和可执行文件。CMake 不会将任何文件写入源目录,只会写入二进制目录。
强烈建议使用源代码目录和二进制目录不同的源代码外构建。支持源目录和二进制目录相同的源内构建,但应尽可能避免。源外构建使得维护干净的源代码树变得非常容易,并允许快速删除构建生成的所有文件。使构建树与源树不同还可以轻松支持单个源树的多个构建。当您想要使用不同选项但只有一份源代码副本的多个构建时,这很有用。

基本的CMake用法

CMake 将一个或多个 CMakeLists 文件作为输入,并生成项目文件或 Makefiles 以用于各种本机开发工具。
典型的 CMake 流程如下:

  1. 项目在一个或多个 CMakeLists 文件中定义
  2. CMake 配置并生成项目
  3. 用户使用他们最喜欢的原生开发工具构建项目

以下部分详细描述了该过程的每个步骤。

CMakeLists 文件

CMakeLists 文件(实际上CMakeLists.txt,但通常省略扩展名)是纯文本文件,其中包含 CMake 语言中的项目描述。这cmake-language表示为一系列注释、命令和变量。您可能想知道为什么 CMake 决定拥有自己的语言而不是使用现有的语言,例如 Python、Java 或 Tcl。主要原因是 CMake 开发人员不想让 CMake 需要额外的工具才能运行。通过要求其中一种语言,所有 CMake 用户都需要安装该语言,并且可能需要安装该语言的特定版本。出于性能和功能的原因,这是完成某些 CMake 工作所需的语言扩展之上的。

CMake 的 Hello World

首先,让我们考虑最简单的 CMakeLists 文件。要从一个源文件编译可执行文件,CMakeLists 文件将包含三行:

cmake_minimum_required(VERSION 3.20)
project(Hello)
add_executable(Hello Hello.c)

顶级 CMakeLists 文件的第一行应始终为 cmake_minimum_required. 这允许项目需要给定版本的 CMake,此外,还允许 CMake 向后兼容。
任何顶级 CMakeLists 文件的下一行应该是project 命令。此命令设置项目的名称,并可以指定其他选项,例如语言或版本。
对于 CMakeLists.txt 文件调用项目中的每个目录project命令,CMake 生成顶级 Makefile 或 IDE 项目文件。该项目将包含 CMakeLists.txt 文件和任何子目录中的所有目标,如 add_subdirectory命令。如果EXCLUDE_FROM_ALL选项用于add_subdirectory命令,生成的工程不会出现在顶层 Makefile 或 IDE 工程文件中;这对于生成在主构建过程中没有意义的子项目很有用。考虑到具有多个示例的项目可以使用此功能通过运行一次 CMake 为每个示例生成构建文件,但不会将示例构建为正常构建过程的一部分
最后,使用add_executable命令使用给定的源文件将可执行文件添加到项目中。
在此示例中,源目录中有两个文件: CMakeLists.txt和Hello.c.
下一节将介绍如何使用 CMake GUI 和命令行界面配置和构建项目。

配置以及生成

创建 CMakeLists 文件后,CMake 会处理文本文件并在缓存文件中创建条目。用户可以编辑 CMakeLists 文件或使用 CMake gui 或 ccmake 指定缓存值并重新配置。接下来,CMake 使用缓存条目在用户所需的构建系统(例如 Makefile 或 Visual Studio 解决方案)中生成项目

运行 CMake GUI

CMake 包括一个基于 Qt 的用户界面,可以在大多数平台上使用,包括 UNIX、Mac OS X 和 Windows。这 cmake-gui包含在 CMake 源代码中,但您需要在系统上安装 Qt 才能构建它。
在这里插入图片描述在 Windows 上,可执行文件已命名cmake-gui.exe,它应该位于“程序文件”下的“开始”菜单中。您的桌面上也可能有一个快捷方式,或者如果您从源代码构建 CMake,它将位于构建目录中。对于 UNIX 和 Mac 用户,可执行文件已命名 cmake-gui,并且可以在您安装 CMake 可执行文件的位置找到。将出现一个类似于图 1所示的 GUI. 前两个字段是源代码和二进制目录。它们允许您指定要编译的源代码所在的位置,以及生成的二进制文件应放置的位置。您应该首先设置这两个值。如果您指定的二进制目录不存在,它将为您创建。如果二进制目录之前已经被 CMake 配置过,它会自动设置源代码树。

运行 ccmake接口

在大多数 UNIX 平台上,如果支持 curses 库,CMake 会提供一个名为ccmake的可执行的程序. 该界面是一个基于终端的文本应用程序,与 cmake-gui相似. 运行ccmake,需要将目录更改为要放置二进制文件的目录。然后运行ccmake,在命令行上使用源目录的路径。这将启动文本界面,如图 2所示。
在这里插入图片描述简要说明显示在窗口底部。如果您点击“c”键,它将配置项目。您应该始终在更改缓存中的值后进行配置。要更改值,请使用箭头键选择缓存条目,然后按 Enter 键进行编辑。布尔值将使用回车键切换。一旦你设置了所有你喜欢的值,你可以点击“g”键来生成 Makefiles 并退出。您还可以按“h”寻求帮助,按“q”退出,按“t”切换高级缓存条目的查看。

从命令行运行 CMake

从命令行,cmake可执行文件可用于生成项目构建系统。这最适合选项很少或没有选项的项目。对于像 VTK 这样的大型项目,使用ccmake, 或者cmake-gui被推荐。建立一个项目cmake,首先创建并更改目录到您想要放置二进制文件的位置。跑 cmake指定源树的路径并使用-D标志传递任何选项。不像ccmake, 或者 cmake-gui,使用时配置和生成步骤合二为一cmake可执行。

为 CMake 指定编译器

在某些系统上,您可能有多个编译器可供选择,或者您的编译器可能位于非标准位置。在这些情况下,您需要向 CMake 指定所需编译器所在的位置。有三种指定方式:生成器可以指定编译器;可以设置环境变量;或者可以设置缓存条目。一些生成器与特定的编译器相关联;例如,Visual Studio 19 生成器始终使用 Microsoft Visual Studio 19 编译器。对于基于 Makefile 的生成器,CMake 将尝试一系列常用编译器,直到找到一个可以工作的编译器。
可以在运行 CMake 之前使用可以设置的环境变量来抢占这些列表。CC环境变量指定 C 编译器,而指定CXXC++ 编译器。例如,您可以直接在命令行上指定编译器 -DCMAKE_CXX_COMPILER=cl。一次cmake已经运行并选择了一个编译器,如果您想更改编译器,请从一个空的二进制目录重新开始。
编译器和链接器的标志也可以通过设置环境变量来改变。设置LDFLAGS将初始化链接标志的缓存值,而CXXFLAGS和CFLAGS将分别初始化 CMAKE_CXX_FLAGS和CMAKE_C_FLAGS。

构建配置

构建配置允许以不同的方式构建项目以进行调试、优化或任何其他特殊标志集。默认情况下,CMake 支持 Debug、Release、MinSizeRel 和 RelWithDebInfo 配置。调试已打开基本调试标志。Release 开启了基本的优化。MinSizeRel 具有产生最小目标代码的标志,但不一定是最快的代码。RelWithDebInfo 还使用调试信息构建优化的构建。
CMake 处理配置的方式略有不同,具体取决于所使用的生成器。尽可能遵循本机构建系统的约定。这意味着在使用 Makefile 和使用 Visual Studio 项目文件时,配置会以不同的方式影响构建。
Visual Studio IDE 支持构建配置的概念。Visual Studio 中的默认项目通常具有调试和发布配置。在 IDE 中,您可以选择构建调试,文件将使用调试标志构建。IDE 将所有二进制文件放入具有活动配置名称的目录中。这为构建程序的项目带来了额外的复杂性,这些程序需要作为构建过程的一部分从自定义命令中运行。见CMAKE_CFG_INTDIR变量和自定义命令部分,了解有关如何处理此问题的更多信息。变量 CMAKE_CONFIGURATION_TYPES用于告诉 CMake 将哪些配置放入工作区。
使用基于 Makefile 的生成器,在运行 CMake 时只能激活一种配置,并使用 CMAKE_BUILD_TYPE多变的。如果变量为空,则不会将标志添加到构建中。如果变量设置为配置的名称,则将适当的变量和规则(例如 CMAKE_CXX_FLAGS_)添加到编译行。Makefile 不为目标文件使用特殊的配置子目录。要同时构建调试树和发布树,用户需要使用 CMake 的源外构建功能创建多个构建目录,并设置CMAKE_BUILD_TYPE到每个构建所需的选择。例如:
在这里插入图片描述

构建项目

运行 CMake 后,您的项目就可以构建了。如果您的目标生成器基于 Makefiles,那么您可以通过将目录更改为二叉树并键入 make(或 gmake 或 nmake,视情况而定)来构建项目。如果您为 Visual Studio 等 IDE 生成了文件,则可以启动 IDE,将项目文件加载到其中,然后像往常一样进行构建。
另一种选择是使用cmake的–build选项从命令行。此选项只是一种方便,允许您从命令行构建项目,即使这需要启动 IDE
这就是为简单项目安装和运行 CMake 的全部内容。在接下来的章节中,我们将更详细地考虑 CMake,并解释如何在更复杂的软件项目中使用它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值