CMake快速入门

文章目录

  • 目的
  • 环境准备
  • 快速入门
  • 总结

目的

C/C++的代码可以直接使用编译工具链进行编译,这种方式文件一多就不方便了。也可以编写 Makefile 然后使用 make 进行编译,当然写 Makefile 其实也挺繁琐。对于大型项目比较流行的是编写 CMakeLists.txt 然后使用 cmake 工具进行编译。

CMake is a tool to manage building of source code.
CMake 是一个用于管理源代码构建的工具。

官网:https://cmake.org/
在这里插入图片描述

目前 CMake 最新的正式版本是 3.28.4 ,官方也提供了渐进式的教程:https://cmake.org/cmake/help/v3.29/guide/tutorial/index.html

官方的渐进式教程从官方角度多的尽量介绍了官方提供的功能,不过对于入门来说稍稍生硬,对于入门使用来说可以有更快入门的方式的。这篇文章将介绍写更加简单的入门使用的方式。

环境准备

这里在 Ubuntu 22.04 下进行演示,系统安装完成后已经安装了如下内容,如果不安装可能后面 CMake 或是无法安装或是使用缺少组件:

# 基础升级与安装:
sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential
# sudo snap install code --classic # 安装 VS Code

之后就可以安装 CMake 了,本文编写时下面方式安装的就是 3.29.1 版本:

sudo snap install cmake --classic
# cmake --version # 查看版本

对于其它的系统,可以去 CMake 官网下载编译好的二进制文件进行安装。

快速入门

CMake 和 Make等其实是差不多的,像是一门脚本语言,本身并不能编译程序,而是用来描述编译规则的。 CMake 有自己的语法,有命令、变量、语句等,这些内容可以在官方参考手册中找到:
https://cmake.org/cmake/help/v3.29/

CMake 的基本的语法规则如下:

  • CMake脚本文件名为 CMakeLists.txt ,每个项目的每个目录下可以有一个脚本文件;
  • 使用 add_executable 命令来生成可执行文件,使用 add_library 命令来生成库;
  • 可以使用 include_directories 等命令添加头文件路径,使用 aux_source_directory 等命令添加源码路径;

下面是个最基础的演示:
在这里插入图片描述

上面演示中一个个添加了所有涉及的文件,如果文件多了这么操作其实是不方便的,也可以直接添加目录:
在这里插入图片描述

如果项目更大的情况下上面方式其实还是比较麻烦,完全可以由 CMake 语句和变量自动遍历所有目录进行添加:
在这里插入图片描述

除了直接生成可执行文件,也可以生成库或者引用库:
在这里插入图片描述

总结

CMake的入门使用还是比较简单的,其目的是为了简化项目构建编译流程,相比Make的语法来说CMake的语法相对来说简单些,更多内容可以参考官方参考手册:
https://cmake.org/cmake/help/v3.29/

另外CMake其实是一个统称,包含了好几个工具,除了核心的cmake,还有ctest、cpack测试打包工具以及cmake-gui、ccmake等图形化工具。

CMake确实比Make简单很多,不过也由好多人觉得CMake还是挺复杂的,所有也诞生出一些别的工具来进行项目构建,比如 xmake

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

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

相关文章

【C++基础】chrono

1、chrono介绍 chrono 是 C 标准库中的一个头文件,提供了处理日期、时间、时钟等时间相关操作的功能。它在 C11 标准中引入,提供了更方便、更强大的时间处理功能。 1.1 类: std::chrono::duration: 代表时间段,可以表示一段时间…

C/C++字符串操作

C/C对字符串的操作提供了丰富的函数库,这些函数可以用于创建、修改、比较和搜索字符串等。以下是一些常用的字符串操作函数及其使用说明: C语言中的字符串操作 在C语言中,字符串通常以字符数组的形式存在,并以空字符&#xff08…

SpringBoot中注册Bean的方式汇总

文章目录 ComponentScan Componet相关注解BeanImportspring.factories总结Configuration和Component的主要区别?Bean是不是必须和Configuration一起使用?Import导入配置类有意义?出现异常:java.lang.NoClassDefFoundError: Could…

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama(CPU only版)》 介绍了如何一键快捷部署Ollama,今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数:2B(1.6GB)、7B&#xff…

TCP协议--传输机制

TCP协议原理 TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率两个方面,即在保证数据可靠传输的情况下尽可能的提高效率 可靠传输机制 确认应答机制 向对方发送一个数据报,对方要返回一个确认应答的数据报 实现的方式&#x…

文心一言 VS 讯飞星火 VS chatgpt (236)-- 算法导论17.3 2题

二、使用势能法重做练习17.1-3。练习17.1-3的内容是:假定我们对一个数据结构执行一个由 n 个操作组成的操作序列,当 i 严格为 2 的幂时第 i 个操作的代价为 i ,否则代价为1。使用聚合分析确定每个操作的摊还代价。如果要写代码,请…

JAVA实现人工智能,采用框架SpringAI

Spring AI介绍 Spring AI是AI工程师的一个应用框架,它提供了一个友好的API和开发AI应用的抽象,旨在简化AI应用的开发工序,例如开发一款基于ChatGPT的对话应用程序。 项目地址:https://github.com/spring-projects-experimental/sp…

AGV小车导航避障雷达SE-0533(CNS-LS05C)激光传感器RS232|RS485|CAN BUS连线说明

AGV小车导航避障雷达SE-0533(CNS-LS05C)激光传感器广泛应用到AGV小车,RGV小车,无人叉车、搬运机器人等领域。本文重点介绍AGV小车导航避障雷达SE-0533(CNS-LS05C)激光传感器RS232|RS485|CAN BUS连线说明。 一、线序定义 1、传感器线缆线序定义 SE-053…

用栈来模拟队列

思路&#xff1a;首先栈是先进后出&#xff0c;队列是先进先出&#xff0c;所以用两个栈来模拟队列&#xff0c;一个用来进&#xff0c;一个用来出&#xff0c;用来进的再弹给用来出的便是队列的顺序了&#xff0c;具体代码如下 class MyQueue { public: stack<int> sa…

分层风格的软件架构设计概念及其实际应用

摘要 分层风格的软件架构是一种将系统功能分解成多个层次的设计模式&#xff0c;每个层次负责特定的功能&#xff0c;层与层之间通过定义良好的接口进行交互。这种架构风格广泛应用于多种软件系统&#xff0c;如企业应用、操作系统和网络协议等。本文将探讨分层架构的基本概念…

C++引用和右值引用

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

postgis导入shp数据时“dbf file (.dbf) can not be opened.“

作者进行矢量数据导入数据库中出现上述报错 导致报错原因 导入的shp文件路径太深导入的shp文件名称或路径中有中文将需要导入数据的shp 文件、dbf 文件、prj 等文件放在到同一个文件夹内&#xff0c;且名字要一致&#xff1b;导入失败&#xff1a; 导入成功&#xff1a;

js基础知识+练习

一&#xff0c;JavaScript简单了解 1.什么是JavaScript JavaScript简称JS&#xff0c;是较为流行的一种前端编程语言&#xff0c;是一种脚本语言&#xff0c;通过解释器运行&#xff0c;主要在客户端&#xff08;浏览器&#xff09;上运行&#xff0c;现在也可以基于node.js在服…

Python实现外观模式、桥接模式、组合模式和享元模式

今天介绍四种结构型设计模式&#xff1a;外观模式、桥接模式、组合模式和享元模式 外观模式 外观模式&#xff08;Facade Pattern&#xff09;&#xff0c;它为子系统提供一个统一的接口&#xff0c;使得子系统更加容易使用。 在Python中&#xff0c;我们可以通过定义一个外…

MYSQL08_页的概述、内部结构、文件头、文件尾、最大最小记录、页目录、区段表

文章目录 ①. 页的概述、大小②. 页的内部结构③. 第一部分 - 文件头④. 第一部分 - 文件尾⑤. 第二部分 - 空闲、用户记录、最大最小⑥. 第三部分 - 页目录⑦. 第三部分 - 页面头部⑧. 从数据页角度看B树⑨. 区、段和表、碎片区 ①. 页的概述、大小 ①. 数据库的存储结构&…

YOLO系列汇总 | 持续更新

文章目录 1 YOLOv1(2015, Joseph Redmon)2 YOLOv2(2016, Joseph Redmon)3 YOLOv3(2018, Joseph Redmon)4 YOLOv4(2020, Alexey Bochkovskiy, Chien-Yao Wang)5 YOLOV5(2021&#xff0c;Ultralytics)6 YOLOX(2021, Megvii旷视)7 YOLOv6(2022&#xff0c;美团)8 YOLOv7(2022&…

【深度学习】多层感知机与卷积神经网络解析

引言&#xff1a; 在人工智能的宏伟画卷中&#xff0c;深度学习如同一笔瑰丽而深邃的色彩&#xff0c;为这幅画增添了无限的生命力和潜能。作为支撑这一领域核心技术的基石&#xff0c;多层感知机&#xff08;MLP&#xff09;和卷积神经网络&#xff08;CNN&#xff09;在模仿人…

vivado ila 运行触发器、停止触发器、使用自动重新触发

运行触发器 您可在 2 种不同模式下运行或装备 ILA 核触发器 &#xff1a; • “ Run Trigger ” &#xff1a; 选择要装备的 ILA 核 &#xff0c; 然后单击“ ILA 仪表板 (ILA Dashboard) ”窗口或“硬件 (Hardware) ”窗口 工具栏上的“ Run Trigger ”按钮即可装备 IL…

MySQL :事务隔离级别实现方法

事务具有四个特性 原子性&#xff0c;要么全成功要么全失败&#xff0c;通过undo log实现持久性&#xff0c;不会因为断电等特殊情况造成数据丢失&#xff0c;通过redo log实现隔离性&#xff0c;事务之间互相不干扰&#xff0c;通过MVCC实现一致性&#xff0c;事务执行前后整…

双指针运用:删除重复元素、移除元素

26.删除重复元素 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元…