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,一经查实,立即删除!

相关文章

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…

文心一言 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…

C++引用和右值引用

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

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

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

js基础知识+练习

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

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

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

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,Ultralytics)6 YOLOX(2021, Megvii旷视)7 YOLOv6(2022,美团)8 YOLOv7(2022&…

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

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

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

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

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

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

Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 1.volatile的可见性 一个典型的例子:永不停止的循环。 public class Forever…

【python】Python上海二手房数据分析可视化(数据集+源码+报告)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Electron 桌面端应用的使用 ---前端开发

Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门…

Spring Boot - 利用MDC(Mapped Diagnostic Context)实现轻量级同步/异步日志追踪

文章目录 Pre什么是MDC(Mapped Diagnostic Context)Slf4j 和 MDC基础工程工程结构POMlogback-spring.xmlapplication.yml同步方式方式一: 拦截器自定义日志拦截器添加拦截器 方式二: 自定义注解 AOP自定义注解 TraceLog切面 测试…

ES查询和监控

es安装 参考https://blog.csdn.net/okiwilldoit/article/details/137107087 再安装kibana,在它的控制台里写es查询语句。 es指南 es权威指南-中文版: kibana用户手册-中文版: es中文社区 es参考手册API es客户端API es查询语句 # 查询e…

Spring Boot:Web开发之三大组件的整合

Spring Boot 前言Spring Boot 整合 ServletSpring Boot 整合 FilterSpring Boot 整合 Listener前言 在 Web 开发中,Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码,通过 Java 的 API 动态的向客户端输出内容。Filter 是处于客户端与服务…