2.CMake的入门准备

2023-11-15

在计算机上获取以及安装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,并解释如何在更复杂的软件项目中使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.CMake的入门准备 的相关文章

  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 格式说明符%02x

    我有一个简单的程序 include
  • 是否需要销毁运算符删除的形式才能真正销毁对象?

    C 20 添加了破坏形式operator delete区别于std destroying delete t范围 它导致delete表达式在调用之前不再销毁对象operator delete 目的是在显式调用对象的析构函数和释放内存之前 允许
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • lssvm实例

    clc clear close all 产生训练样本 xn train1 1 2 200 训练样本 每一列为一个样本 xn train2 1 1 100 dn train1 xn train1 2 xn train2 训练目标 行向量 dn
  • 2022产业区块链年度峰会暨FISCO BCOS五周年生态大会

    作为深圳国际金融科技节系列活动之一 由深圳市地方金融监督管理局指导 微众银行 金链盟主办的 2022产业区块链年度峰会暨FISCO BCOS五周年生态大会 将于2月24日下午 在深圳前海华侨城JW万豪酒店举行 此次大会以 数实相生 链筑可持
  • 垂直广告是什么意思_爆火的广告投放方式,抖音Feed流是什么?

    借势2020年的魔幻 短视频行业发展得如火如荼 年初的集体空闲 带动了各大短视频平台的发展 大量抖音创作者的涌入 也让出圈变得越来越难 为了更快出圈 有效利用流量 DOU 和Feed流应运而生 之前已经跟大家讲过DOU 投放的相关事宜 这期
  • 数据结构(三)- 数据的基本操作—增删查

    数据结构 三 增删查 文章目录 数据结构 三 增删查 前言 一 代码对数据的处理 二 数据处理的基本操作 总结 前言 数据最基本的操作 增删查 一 代码对数据的处理 在上篇文章数据结构 二 时间复杂度与空间复杂度中出现的一个例子 在一个数组
  • ubuntu16.04下如何训练PySOT(四):训练、测试、运行demo、评估

    下载预训练模型 从 Google Drive 下载 将预训练模型复制到 pretrained models 文件夹中 训练 在tools目录下打开终端 输入以下命令 即开始训练 CUDA VISIBLE DEVICES 0 python m
  • Matlab中米粒图像处理,米粒个数和大小计算

    clear clc 读取图片rice png I imread rice png 获取图片的背景 BG imopen I strel disk 15 得到背景均匀的图片 I2 imsubtract I BG 得到二值化的图片 level g
  • OpenStack常用命令搜集 —— 筑梦之路

    之前学习搭建过OpenStack 好久都没有使用了 这里主要搜集下OpenStack的常用命令 温故而知新 OpenStack 搭建记录 筑梦之路 筑梦之路的博客 CSDN博客 查看日志 日志位置 使用devstack方式部署 默认日志路径
  • Springboot使用future异步获取ip地址对应的地理位置

    future介绍 Future代表的是异步执行的结果 意思是当异步执行结束之后 返回的结果将会保存在Future中 那么我们什么时候会用到Future呢 一般来说 当我们执行一个长时间运行的任务时 使用Future就可以让我们暂时去处理其他
  • javax.net.ssl.SSLHandshakeException

    点击打开链接 以下是网上搜到的解决方案 在初始化httpclient实例前加上两行 ProtocolSocketFactory fcty new MySecureProtocolSocketFactory Protocol register
  • umijs中开启hd后配置的px2rem设置哪些样式转换为rem单位

    开启高清hd即使用rem单位 会自动把项目中的所有px单位转换为rem单位 并且根据屏幕大小自动调节html的基础font size 这样的好处一个网站不同大小分辨率效果基本一样 先贴一份umi的配置 config config js内容如
  • 副业怎么赚到钱?有哪些能赚钱的副业?

    副业怎么赚到钱 有哪些能赚钱的副业 所处城市偏僻的话 做网络上的副业最合适 不受地域限制 甚至在家 在路上 在单位工作间隙都能做 挣的跟一二线城市一样多 我列几个自己或者朋友真实做过的 都能挣到钱 就是没有月入过万那么夸张 一两千块还是很简
  • SoapUI、Jmeter、Postman三种接口测试工具的比较分析——灰蓝

    前段时间忙于接口测试 也看了几款接口测试工具 简单从几个角度做了个比较 拿出来与诸位分享一下吧 各位如果要转载 请一定注明来源 最好在评论中告知博主一声 感谢 本报告从多个方面对接口测试的三款常用工具进行比较分析 以便于在特定的情况下选择最
  • STL基本容器及算法

    STL 1 STL 常用容器 1 string 1 1基本概念 本质 string和C 风格的字符串 而string本质上是一个类 string和char 区别 char 是一个指针 string是一个类i 类内部封装了char 管理这个字
  • windows203+sql server 2000无法打开1433端口

    windows203 sql server 2000无法打开1433端口 1 如果你是win2003 那么一定要安装sql的补丁sp4 检查你的SQL有没有打补丁 没有的话要打上补丁 检查的方法是在查询分析器中运行 select versi
  • 如何构建多域名HTTPS代理服务器转发

    在当今互联网时代 安全可靠的网络访问是至关重要的 本文将介绍如何使用SNI Routing技术来构建多域名HTTPS代理服务器转发 轻松实现多域名的安全访问和数据传输 SNI代表 Server Name Indication 是TLS协议的
  • 接口测试 —— Requests库介绍

    1 Requests库 Requests库是用Python语言编写 基于urllib3模块 采用Apache2 Licensed开源协议的 HTTP 库 虽然Python的标准库中urllib3模块已经包含了平常我们使用的大多数功能 但是它
  • 2010.03.09(2)——Hibernate注解 无主键表

    2010 03 09 2 Hibernate注解 无主键表 今天写了个jfreechar从后台传数据的例子 就随便编了两个表 懒的写主键了 我用的是springmvc hibernate的方式 由于没有主键 我的注解如下 Entity Ta
  • 完整的 CentOS 系统服务器初始化配置、系统安全加固、系统内核参数优化以及常用软件安装脚本分享...

    描述 适用于企业内部 CentOS7 系列服务器初始化 系统安全加固脚本 内容包含了 网络初始化设置 软件更新源替换以及内核升级实践 时间时区初始化设置 系统安全加固 等保三级操作系统主机检查项 安全运维设置 系统内核参数 常用软件安装等
  • Vue技术_props配置(提高了组件的复用性)

    一 props简介 在Vue中 props属性是用于组件之间传递数据的一种机制 通过在子组件中定义props属性 可以接收父组件传递的数据 并在子组件中使用这些数据 下面是props属性的一些详细说明 1 定义和传递props 在子组件中使
  • 2.CMake的入门准备

    在计算机上获取以及安装CMake 在使用 CMake 之前 您需要在系统上安装或构建 CMake 二进制文件 在许多系统上 您可能会发现 CMake 已经安装或可以使用系统的标准包管理器工具进行安装 Cygwin Debian FreeBS