CMake:开始

news2025/1/17 4:04:55

文章目录

  • 在计算机上获取和安装 CMake
  • 目录结构
  • 基本 CMake 用法
  • CMakeLists文件
  • 适用于 CMake 的 Hello World
  • 配置和生成
  • 运行 CMake GUI
  • 运行 ccmake Curses 接口
  • 从命令行运行 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 文件将包含三行:

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才能构建它。

../_images/ccmakerunningonUNIX.png
图 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>

# 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 详细说明并解释如何在更复杂的软件项目中使用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sharding-JDBC源码解析与vivo的定制开发

作者&#xff1a;vivo IT 平台团队 - Xiong Huanxin Sharding-JDBC是在JDBC层提供服务的数据库中间件&#xff0c;在分库分表场景具有广泛应用。本文对Sharding-JDBC的解析、路由、改写、执行、归并五大核心引擎进行了源码解析&#xff0c;并结合业务实践经验&#xff0c;总结…

Unity 轮转图, 惯性, 自动回正, 点击选择

简单的实现 2D 以及 3D 的轮转图, 类似于 Web 中无限循环的轮播图那样. 文中所有代码均已同步至 github.com/SlimeNull/UnityTests 3D 轮转图: Assets/Scripts/Scenes/CarouselTestScene/Carousel.cs2D 轮转图: Assets/Scripts/Scenes/CarouselTestScene/UICarousel.cs 主要逻…

Nodejs web服务器之GET、POST请求初次体验

一、认识http请求 步骤 1.DNS解析域名&#xff0c;找到ip地址&#xff0c;建立TCP连接&#xff0c;发起http请求 2.服务器接收到http请求&#xff0c;进行处理&#xff0c;返回数据 3.客户端接收到返回的数据&#xff0c;处理数据&#xff08;比如渲染页面&#xff09; 二、no…

新生儿睡眠抖动:温馨抚慰宝宝的安稳梦乡

引言 新生儿的睡眠过程常常伴随着轻微的抖动&#xff0c;对于许多父母来说&#xff0c;这可能会引起一些担忧。在这篇文章中&#xff0c;我们将探讨新生儿睡眠抖动的原因和注意事项&#xff0c;帮助父母更好地理解和处理宝宝的这种行为&#xff0c;为宝宝提供安心的睡眠环境。…

基于FPGA的HyeperRam接口设计与实现

一 HyperRAM 针对一些低功耗、低带宽应用&#xff08;物联网、消费产品、汽车和工业应用等&#xff09;&#xff0c;涉及到外部存储&#xff0c;HyperRAM提供了更简洁的内存解决方案。 HyperRAM具有以下特性&#xff1a; 1、超低功耗&#xff1a;200MHz工作频率下读写不到50mW…

UE5数字孪生系列笔记(一)

智慧城市数字孪生系统 虚幻引擎连接数据库 将自己的mysql版本的libmysql.dll替换掉插件里面的libmysql.dll 然后将这个插件目录复制到虚幻项目目录下 然后添加这个插件即可 新建一个UMG&#xff0c;添加一个按钮试试&#xff0c;数据库是否连接 将UI添加到视口 打印是否连接…

自研在线CAD系统介绍

去年调研了已有的在线的CAD系统(悟空CAD、维杰地图、梦想控件)&#xff0c;基本上都是按年收费&#xff0c;还相当的贵&#xff0c;基于此&#xff0c;就萌生了自己研发CAD系统的想法&#xff0c;从技术选型、框架设计、代码实现基本为都是自研实现。已经有了初步的成果。 10M…

chatGPT的耳朵!OpenAI的开源语音识别AI:Whisper !

语音识别是通用人工智能的重要一环&#xff01;可以说是AI的耳朵&#xff01; 它可以让机器理解人类的语音&#xff0c;并将其转换为文本或其他形式的输出。 语音识别的应用场景非常广泛&#xff0c;比如智能助理、语音搜索、语音翻译、语音输入等等。 然而&#xff0c;语音…

如何选择乐歌升降台,一张图带你了解全型号参数功能

在现代办公环境中&#xff0c;久坐已成为一种常态&#xff0c;而这种生活方式带来的不良影响日益凸显。乐歌办公升降电脑台应运而生&#xff0c;不仅是一种办公家具&#xff0c;更是健康办公的有力助手。让我们从多个角度深入了解这款产品的功能意义。 1. 台面层数 乐歌办公升…

mysql bug( InnoDB: Error number 22),表突然不能读取

mysql bug&#xff08; InnoDB: Error number 22&#xff09;&#xff0c;表突然不能读取 bug最开始的bug&#xff1a;表突然不能读取关闭mysql容器&#xff0c;再次重启失败 解决方案不重建容器的几种可能措施重建容器重建如果懒得打命令或者忘记命令可能的run bug&#xff1a…

MATLAB中设置输出格式

目录 设置输出中行间距的格式 设置浮点数格式 使代码换行以适应窗口宽度 隐藏输出 按页查看输出 清空命令行窗口 MATLAB 同时在命令行窗口和实时编辑器中显示输出。可以使用提供的多个选项为输出显示设置格式。 设置输出中行间距的格式 默认情况下&#xff0c;MATLAB 会…

【Qt学习】QProgressBar的使用(进度条的实现)

文章目录 1. 介绍2. 实例2.1 按钮启动进度条2.2 更改进度条样式2.3 资源文件 1. 介绍 详细的 QProgressBar 内容可以通过 查阅Qt官方文档 &#xff0c;这里进行简要的总结&#xff1a; QProgressBar 是Qt框架中的一个控件&#xff0c;用于显示进度条&#xff1a; QProgressBar…

huggingface.datasets使用说明

诸神缄默不语-个人CSDN博文目录 datasets包的官方GitHub项目&#xff1a;huggingface/datasets: &#x1f917; The largest hub of ready-to-use datasets for ML models with fast, easy-to-use and efficient data manipulation tools datasets包可以加载很多公开数据集&a…

免费SSL证书和付费SSL证书的区别

免费证书和付费证书区别还是比较大的&#xff0c;相对来说免费证书适用的环境会单一一些&#xff0c;一般使用免费证书的环境都是个人门户网站或者是小微企业的门户官网&#xff08;无隐私信息&#xff09;。 受免费证书安全等级以及安全性的限制影响&#xff0c;如果是为了自…

Python 语法高亮显示和格式化库之pygments使用详解

概要 在软件开发和编程领域,代码是我们的主要表达方式。因此,对于代码的可读性和可理解性至关重要。为了提高代码的可读性,代码语法高亮和格式化工具变得至关重要。在Python世界中,Pygments是一个强大的工具,它可以帮助开发人员高亮显示和格式化他们的代码。本文将深入探…

selenium4的相对定位

selenium4相对定位 Selenium 4新增了相对定位器&#xff0c;能帮助用户查找元素附近的其他元素。可用的相对定位器有above、below、toLeftOf、toRightOf、near。在Selenium 4中&#xff0c;find_element方法能够接受一个新方法withTagName&#xff0c;它将返回一个RelativeLoca…

【IEEE会议征稿通知】第九届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2024)

【IEEE会议】第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISCTT 2024&#xff09; 2024 9th International Conference on Information Science, Computer Technology and Transportation 第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISC…

七彩虹八渐变 外贸建站公司wordpress模板

进出口水果wordpress外贸模板 漂亮水果wordpress外贸模板&#xff0c;做水果进出品生意的外贸公司自建站官网模板。 https://www.jianzhanpress.com/?p3516 玩具wordpress外贸模板 简洁玩具wordpress外贸模板&#xff0c;适合做跨境电商外贸公司使用的wordpres外贸s网站主题…

JVM运行时数据区——对象的实例化内存布局与访问定位

文章目录 1、对象的实例化1.1、创建对象的方式1.2、创建对象的步骤 2、对象的内存布局3、对象的访问定位3.1、对象访问的定位方式3.2、使用句柄访问3.3、使用指针访问 4、小结 平时大家经常使用new关键字来创建对象&#xff0c;那么我们创建对象的时候&#xff0c;怎么去和运行…

前端语义化标签及实例

常用的语义化标签的以下几种&#xff1a; header、nav、article、section、aside、footer、abbr、dfn、address、del、ins、pre、meter、progress <header> 定义文章的页眉信息 <header><h1>我的网站标题</h1><nav><ul><li><a …