CMake:开始

文章目录

  • [在计算机上获取和安装 CMake](#在计算机上获取和安装 CMake)
  • 目录结构
  • [基本 CMake 用法](#基本 CMake 用法)
  • CMakeLists文件
  • [适用于 CMake 的 Hello World](#适用于 CMake 的 Hello World)
  • 配置和生成
  • [运行 CMake GUI](#运行 CMake GUI)
  • [运行 ccmake Curses 接口](#运行 ccmake Curses 接口)
  • [从命令行运行 CMake](#从命令行运行 CMake)
  • [将编译器指定为 CMake](#将编译器指定为 CMake)
  • 构建配置
  • 构建项目

在计算机上获取和安装 CMake

在使用 CMake 之前,您需要安装或构建 CMake 系统上的二进制文件。在许多系统上,您可能会发现 CMake 是 已安装或可与标准一起安装 系统的包管理器工具。Cygwin、Debian、FreeBSD、OS X MacPorts、Mac OS X Fink 和许多其他公司都有 CMake 发行版。

如果您的系统没有 CMake 软件包,您可以找到 CMake 预编译 对于 CMake 下载页面上的许多常见体系结构。选择所需的版本 并按照下载说明进行操作。CMake 可以安装到任何目录, 因此,安装不需要 root 权限。

如果找不到系统的预编译二进制文件,则可以构建 CMake from source.要构建 CMake,您需要一个现代 C++ 编译器和 从 CMake 下载页面或 Kitware 的 GitLab 实例分发源代码。要构建 CMake,请按照源代码树顶部的说明进行操作。Readme.txt

目录结构

CMake 在构建项目时使用两个主要目录:源代码 目录和二进制目录。源目录是项目源代码存放的位置。这也是 CMakeLists 文件所在的位置。二进制目录有时称为构建目录,也是CMake 放置生成的对象文件、库和可执行文件的位置。 CMake 不会将任何文件写入源目录,只会写入二进制文件 目录。

强烈鼓励源代码外构建,即源目录和二进制目录不同 。源代码内构建,即源代码和二进制文件 目录相同,也是可以的,但应尽可能避免。 源代码外构建使维护干净的源代码树变得非常容易,并且 允许快速删除生成的所有文件。拥有 构建树与源码树的不同也使得拥有 单个源代码树的多个构建变得更容易。当需要不同选项的多个构建版本,但只有一个源代码副本时,这很有用。

基本 CMake 用法

CMake 将一个或多个 CMakeLists 文件作为输入并生成项目文件 或 Makefile,用于各种本机开发工具。

典型的 CMake 流程如下:

项目在一个或多个 CMakeLists 文件中定义

CMake 配置并生成项目

用户使用自己喜欢的原生开发工具构建项目

以下各节详细介绍了该过程的每个步骤。

CMakeLists文件

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

适用于 CMake 的 Hello World

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

csharp 复制代码
cmake_minimum_required(VERSION 3.20)
project(Hello)
add_executable(Hello Hello.c)

顶级 CMakeLists 文件的第一行应始终为 cmake_minimum_required。这允许项目需要给定的 CMake 的版本,此外,还允许 CMake 向后兼容。

任何顶级 CMakeLists 文件的下一行都应是project 命令。此命令设置项目的名称,并可以指定其他 语言或版本 等选项。

对于项目中 CMakeLists.txt 文件调用的每个目录 命令中,CMake 会生成顶级 Makefile 或 IDE 项目文件。该项目将包含 CMakeLists.txt命令指定的文件和任何子目录,如同 add_subdirectory命令。如果EXCLUDE_FROM_ALL选项 在add_subdirectory命令中使用时,生成的项目将 未出现在顶级 Makefile 或 IDE 项目文件中;这是 对于生成子项目而不作为主要构建过程的一部分非常有用。考虑到一个项目具有多个 示例可以使用此功能为每个 示例生成,但不将示例作为一部分生成 普通的构建过程。

最后,使用add_executable命令将可执行文件添加到 使用给定源文件的项目。

在此示例中,源目录中有两个文件:CMakeLists.txtHello.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才能构建它。

图 1:基于 Qt 的 CMake GUI

在 Windows 上,可执行文件已命名,并且应命名为 在"开始"菜单中的"Program Files"下。也可能有捷径 在您的桌面上,或者如果您从源代码构建了 CMake,它将位于 构建目录。对于 UNIX 和 Mac 用户,可执行文件已命名,并且可以在安装 CMake 的位置找到它 可执行文件。GUI 的外观类似于图 1 所示。前两个字段是源代码 和二进制目录。它们允许您指定源的位置 代码位于要编译的内容以及生成的代码的位置 应放置二进制文件。您应该首先设置这两个值。如果 您指定的二进制目录不存在,它将被创建 给你的。如果 CMake 之前已经配置了二进制目录, 然后,它将自动设置源代码树。cmake-gui.execmake-gui

运行 ccmake Curses 接口

在大多数 UNIX 平台上,如果支持 curses 库,则 CMake 提供一个名为 ccmake 的可执行文件。这个接口是一个 基于终端的文本应用程序,与 cmake-gui类似 .要运行 ccmake ,请更改 目录添加到要放置二进制文件的目录中。然后 使用源目录的路径运行 ccmake 命令行。这将启动文本界面,如图 2 所示。

图 2:在 UNIX 上运行的 ccmake

简要说明显示在窗口底部。如果你 点击"C"键,它将配置项目。你应该总是 更改缓存中的值后进行配置。要更改值,请使用 箭头键选择缓存条目,然后按回车键进行编辑 他们。布尔值将使用 Enter 键切换。一旦你设置好了 所有值随心所欲,您可以按"G"键生成 生成文件并退出。您也可以点击"h"寻求帮助,"q"退出,以及 "t"切换高级缓存条目的查看。

从命令行运行 CMake

在命令行中,可以使用可执行文件 cmake 生成项目 buildsystem。这最适合很少有的项目 或者没有选择。对于 VTK 等大型项目,建议使用 ccmake或 cmake-gui 。自 使用 cmake 首先创建和更改构建项目 目录添加到要放置二进制文件的位置。运行cmake指定源代码树的路径并传入 使用标志的任何选项。与ccmake 或 cmake-gui 不同, 使用可执行文件 cmake时,configure 和 generate 步骤被合并为一个。-D

将编译器指定为 CMake

在某些系统上,您可能有多个编译器可供选择,或者 您的编译器可能位于非标准位置。在这些情况下,您将 需要向 CMake 指定所需的编译器所在的位置。那里 有三种方法可以指定:生成器可以指定 编译器;可以设置环境变量;或者缓存条目可以是 设置。一些生成器与特定的编译器相关联;例如, Visual Studio 19 生成器始终使用 Microsoft Visual Studio 19 编译器。对于基于 Makefile 的生成器,CMake 将尝试 通常的编译器,直到它找到一个可用的编译器。

可以使用可设置的环境变量抢占列表 在运行 CMake 之前。环境变量指定 C 编译器,而指定 C++ 编译器。您可以指定 例如,直接在命令行上使用编译器。一旦有 已运行并选择编译器,如果您想更改编译器,请启动 使用空的二进制目录结束。CCCXX-DCMAKE_CXX_COMPILER=cl

编译器和链接器的标志也可以通过设置 环境变量。设置将初始化 链接标志,而 和 将分别初始化 和 。LDFLAGSCXXFLAGSCFLAGSCMAKE_CXX_FLAGSCMAKE_C_FLAGS

构建配置

构建配置允许以不同的方式构建项目 debug、optimized 或任何其他特殊的标志集。CMake 支持, 默认情况下,Debug、Release、MinSizeRel 和 RelWithDebInfo 配置。Debug 打开了基本的调试标志。发布有 基本优化已打开。MinSizeRel 具有产生 最小的目标代码,但不一定是最快的 法典。RelWithDebInfo 使用调试信息构建优化的构建 也。

CMake 处理配置的方式略有不同,具体取决于 在正在使用的发电机上。本机构建的约定 尽可能遵循系统。这意味着配置 使用 Makefile 与使用 Visual Studio 项目文件。

Visual Studio IDE 支持生成配置的概念。一个 Visual Studio 中的默认项目通常具有"调试"和"发布" 配置。在 IDE 中,您可以选择"生成"(build)、"调试"(Debug) 和文件 将使用 Debug 标志构建。IDE 将所有二进制文件 添加到包含活动配置名称的目录中。这 为构建程序的项目带来了额外的复杂性 需要作为生成过程的一部分从自定义命令运行。看 变量和自定义命令部分 有关如何处理此问题的详细信息。该变量用于告诉 CMake 哪个 要放入工作区的配置。

使用基于 Makefile 的生成器,只能激活一个配置 在运行 CMake 时,它使用变量指定。如果变量为空,则没有标志 被添加到生成中。如果变量设置为 配置,然后将适当的变量和规则(如 )添加到编译中 线。Makefile 不使用特殊的配置子目录 对象文件。要同时构建调试树和发布树,用户是 预期使用源代码外创建多个生成目录 构建功能,并将 每个版本都需要选择。例如:CMAKE_CXX_FLAGS_<ConfigName>

csharp 复制代码
# With source code in the directory MyProject
# to build MyProject-debug create that directory, cd into it and
ccmake ../MyProject -DCMAKE_BUILD_TYPE=Debug
# the same idea is used for the release tree MyProject-release
ccmake ../MyProject -DCMAKE_BUILD_TYPE=Release

构建项目

运行 CMake 后,项目将准备好进行生成。如果 你的目标生成器是基于 Makefiles 的,那么你可以构建你的 项目,将目录更改为二叉树并键入 make (或 gmake 或 nmake(视情况而定)。如果为 IDE 生成了文件 例如 Visual Studio,您可以启动 IDE,加载项目文件 进入其中,并像往常一样构建。

另一种选择是使用 的 选项 命令行。此选项只是一种方便,允许您构建 您的项目,即使这需要启动一个 集成开发程序。--build

这就是安装和运行 CMake 的全部内容 项目。在接下来的章节中,我们将在更多方面考虑 CMake 详细说明并解释如何在更复杂的软件项目中使用它。

相关推荐
qq_441996052 分钟前
Mybatis官方生成器使用示例
java·mybatis
巨大八爪鱼8 分钟前
XP系统下用mod_jk 1.2.40整合apache2.2.16和tomcat 6.0.29,让apache可以同时访问php和jsp页面
java·tomcat·apache·mod_jk
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
wclass-zhengge4 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud