cmake初识
cmake
- 什么是软件构建和编译工具
- cmake
- 安装cmake
- windows
- Linux
- 通过cmake编译代码
- 准备CMakeLists.txt
- 注释
- 块状注释
- cmake_minimum_required:确定cmake的最低版本
- project:定义工程名称:
- add_executable:定义工程会生成一个可执行程序
- 准备生成可执行文件
- set
- 设置变量
- 指定输出路径
- 设置C++标准
- 搜索文件
- aux_source_directory 命令可以查找某个路径下的所有源文件
- file
- 指定头文件目录
- 插件配置
之前捯饬CLion的时候,发现有这么一个玩意:
发现,CLion和visiual stduio不一样的地方在于CLion会有一个CMakeList的txt文件,这个在visiual stduio中从来没有过,所以自己研究了一下,发现cmake是一个软件构建和编译工具。我们之前学的Makefile也是这样子的一款软件,如果有小伙伴不知道Makefile是什么的,可以点击下方的连接:
https://blog.csdn.net/qq_67693066/article/details/132979925
今天我们要了解的是一款更强大的软件构建和编译工具——cmake。
什么是软件构建和编译工具
在这之前,还是简单介绍一下软件构建和编译工具:
软件构建和编译工具是用于自动化软件开发过程中的构建和编译任务的工具。它们可以大大简化和加速软件开发流程,并确保软件项目的可靠性和可重复性。这些工具通常提供以下功能:
1.编译代码: 编译工具负责将源代码文件转换为可执行文件或库文件。它们将源代码翻译成计算机可以理解的二进制格式。
2.依赖管理: 许多软件项目依赖于其他软件包或库。构建工具可以自动管理这些依赖关系,确保项目所需的所有组件都是可用的,并在必要时下载或安装它们。
3.代码打包: 构建工具可以将编译后的代码打包成可部署的软件包,如可执行文件、安装程序或容器镜像等。
4.自动化测试: 构建工具可以集成自动化测试框架,并在构建过程中运行测试,以确保代码的质量和稳定性。
5.静态分析: 一些构建工具提供静态代码分析功能,可以检测代码中的潜在问题、错误或不良实践,并提供改进建议。
6.部署支持: 构建工具可以集成部署管道,简化将软件部署到生产环境的过程,并确保部署过程的可靠性和一致性。
以下是一些常见的软件构建和编译工具:
Make: 最早的构建工具之一,用于管理基于文件依赖关系的构建任务。
Apache Ant: 用于 Java 应用程序的构建工具,基于 XML 配置文件。
Apache Maven: 用于 Java 应用程序的构建工具和项目管理工具,支持依赖管理、项目结构标准化等功能。
Gradle: 用于构建 Java 和 Android 应用程序的灵活构建工具,支持 Groovy 和 Kotlin 语言。
GNU Autotools: 用于 Unix 系统的自动配置和构建工具套件,包括 Autoconf、Automake 和 Libtool。
CMake: 跨平台的开源构建系统,用于管理跨平台项目的构建过程。
MSBuild: 由 Microsoft 开发的构建引擎,用于构建 .NET Framework 和 .NET Core 应用程序。
Webpack: 用于构建现代 Web 应用程序的模块化打包工具。
Bazel: 由 Google 开发的构建工具,用于构建和测试多语言项目。
这些构建和编译工具提供了广泛的功能和支持,可以满足不同类型的软件项目的需求。选择合适的工具取决于项目的特性、开发团队的偏好以及特定的技术栈和环境。
简单来说,有了这些软件,我们编译代码的时候效率会大大提升,省时省力。
cmake
了解这么多,我们来看看cmake
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似于UNIX下的automake。CMake的组态档取名为CMakeLists.txt。
CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake和SCons等其他类似系统的区别之处。
CMake的特点主要有:
开放源代码,使用类BSD许可发布。
简化编译构建过程和编译过程。
CMake的使用步骤大致如下:
编写CMakeLists.txt文件。
创建一个build目录(可选),用来存放cmake生成的文件。
进入build目录,执行cmake …命令,将CMakeLists.txt文件转化为make所需的makefile文件。其中,路径“…”表示CMakeLists.txt所在目录(路径可以根据自己CMakeLists.txt所在目录更改)。
在build目录下,执行make命令,生成目标可执行文件。
在CMake中,还提供了许多命令和变量来定制构建过程,如设置编译器选项、链接库、包含目录等。这些都可以通过编辑CMakeLists.txt文件来实现。
总的来说,CMake是一个强大而灵活的跨平台编译工具,可以帮助开发者更方便地构建和编译软件项目。
安装cmake
windows
windows下访问官网,下载对应版本即可:
大家可以点击这里跳转:
https://cmake.org/download/
windows大家了解即可,我们主要来看Linux下的:
Linux
Linux下,不同版本的安装方式可能不一样,我这里是apt安装(Centos是yum)
我们可以用cmake --version查看版本:
通过cmake编译代码
准备CMakeLists.txt
首先我们先创建一个CMakeLists.txt(注意,这里千万不能写错哦):
然后我们进入CMakeLists.txt中去编辑:
注释
cmake的单行注释以#开头:
块状注释
cmake的多行注释以 #[[ 注释内容 ]] :
cmake_minimum_required:确定cmake的最低版本
我们首先写的第一行是确定cmake的最低版本:
这个其实可加可不加,不加可能会有警告。
project:定义工程名称:
project:定义工程名称:
这个其实是一个比较简单的,它其实还有其他的参数:
# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]][DESCRIPTION <project-description-string>][HOMEPAGE_URL <url-string>][LANGUAGES <language-name>...])
比如说:
add_executable:定义工程会生成一个可执行程序
add_executable:定义工程会生成一个可执行程序:
add_executable(可执行程序名 源文件名称)
准备生成可执行文件
这样一个最简单的CMakeLists.txt文件我们就写好了,因为我们执行命令之后会有一大堆的其他文件冒出来,所以我们新建一个文件夹,用来存放我们执行命令后产生的一系列多的文件:
我们进入这个文件:
然后我们要执行最重要的一步,执行cmake,但在这之前,我们要确定CMakeLists.txt在哪里,我们创建了Building文件夹,我们现在在我们创建了Building文件夹,那么我们的CMakeLists.txt就在上一级的目录(CMake_Test)里:
这个时候就会帮我们构建:
这个时候,我们看看Building文件下出现了什么:
我们发现有一个Makefile,我们再执行一下make指令:
这个时候显示他已经帮我们构建好了Mybin,我们显示看看:
我们执行一下Mybin:
执行成功。
set
设置变量
现在有一个问题add_executable如果依赖的文件很多,写起来就会很长:
其实,我们可以将我们的文件名设置成为一个变量,这样我们用起来就方便多了,要设置变量,我们要使用set:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
比如说这样:
如果我们要使用这个变量,我们要加上$:
指定输出路径
set除了设置变量,还可以设置输出路径,设置路径专门有一个宏:EXECUTABLE_OUTPUT_PATH:
EXECUTABLE_OUTPUT_PATH 是 CMake 中的一个变量,用于指定最终生成的可执行文件的存放目录。当你在 CMakeLists.txt 文件中使用 add_executable 命令来添加一个可执行目标时,CMake 会根据EXECUTABLE_OUTPUT_PATH 变量的值来决定将生成的可执行文件放在哪个目录下
这个路径可以是绝对路径,也可以是相对路径:
CMake 会根据当前的处理上下文(通常是 CMakeLists.txt 文件所在的目录)来解释这个相对路径。这意味着相对路径是相对于当前正在处理的 CMakeLists.txt 文件所在的目录,而不是相对于最终构建出的二进制文件所在的目录。
假如有这么一个目录结构:
my_project/ CMakeLists.txt src/ main.cpp bin/
并且这样设置:
set(EXECUTABLE_OUTPUT_PATH bin)
这样设置后,CMake 会将生成的可执行文件放在 my_project/bin 目录中,因为 bin 是相对于 CMakeLists.txt 文件所在目录(my_project/)的相对路径。
设置C++标准
set还可以设置编译时的C++的标准,我们也有一个宏:**CMAKE_CXX_STANDARD **:
# 增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
现在我们来测试一下,我把Building这个文件夹删除:
重新创建一个文件夹reBuilding,然后执行cmake:
这个时候,我们看看文件的变化:
发现多了一个bin文件夹,我们此时再执行make:
我们执行一下:
运行成功。
搜索文件
我们已经会了set设置变量来简化了,但这样还是很麻烦,我们希望cmake可以自动帮我们找到源文件进行编译。
aux_source_directory 命令可以查找某个路径下的所有源文件
aux_source_directory 命令可以查找某个路径下的所有源文件:
aux_source_directory(< dir > < variable >)
比如说:
我们可以删除reBuilding里面的所有东西,重建,实验一下:
file
我们也可以用file来搜索:
file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
这里有两个参数:
GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
这里我们可以只用GLOB,因为我们没有递归:
我们清空reBuilding里面的内容,然后再来一次:
然后make的时候报错了:
因为我们没有指定搜索文件的类型,我们加上:
就OK了~。
指定头文件目录
在编译项目源文件的时候,很多时候都需要将源文件对应的头文件路径指定出来,这样才能保证在编译过程中编译器能够找到这些头文件,并顺利通过编译。在CMake中设置要包含的目录也很简单,通过一个命令就可以搞定了,他就是include_directories:
include_directories(headpath)
插件配置
如果大家vscode可以连上Linux,可以安装这几个插件,代码可以自动补全:
直接在插件搜索就行了,如果vscode没有脸上Linux的,可以点击这里,手把手教你配置:
https://blog.csdn.net/qq_67693066/article/details/136368891
相关文章:

cmake初识
cmake 什么是软件构建和编译工具cmake安装cmakewindowsLinux 通过cmake编译代码准备CMakeLists.txt注释块状注释cmake_minimum_required:确定cmake的最低版本project:定义工程名称:add_executable:定义工程会生成一个可执行程序准备生成可执行…...

Swift 入门学习:集合(Collection)类型趣谈-下
概览 集合的概念在任何编程语言中都占有重要的位置,正所谓:“古来聚散地,宿昔长荆棘;游人聚散中,一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理,怎能不让…...

nova 12 LTPO来了!LTPO动态自适应刷新率屏120Hz体验更流畅 ,1Hz阅读更省电
2023年12月26日,华为召开华为冬季全场景发布会,正式发布华为nova 12系列。全新华为nova 12 Pro/Ultra 上搭载1~120Hz LTPO 动态自适应刷新率屏,作为华为旗舰系列的LTPO特性现在来到了nova 系列上,到底表现如何呢? 手机…...

【rk3368 android6.0 恢复出厂设置功能】
rk3368 android6.0 恢复出厂设置功能 恢复出厂设置三种方法一,设置--进入恢复出厂设置页面二,发送广播形式三,命令形式总结 郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 恢复…...

闲聊电脑(7)常见故障排查
闲聊电脑(7)常见故障排查 夜深人静,万籁俱寂,老郭趴在电脑桌上打盹,桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭:冰箱大哥,平时遇到电脑故障该咋处理呢? 冰箱…...
Vim 编辑器|批量注释与批量取消注释
添加注释 ctrl v 进入块选泽模式。上下键选中需要注释的行。按大写 I (shift i) 进入插入模式,输入注释符。按两次 ESC 退出,即完成添加注释。shift : 再输入 qw 保存退出。 取消注释 ctrl v 进入块选泽模式。上下键选中…...
Android 使用AIDL HAL
生成的目录结构 以audioControl 为例: 首先编写的是aidl文件。 其文件目录结构是:── android │ └── hardware │ └── automotive │ └── audiocontrol │ ├── AudioFocusChange.aidl │ ├── AudioGainConf…...

C++的一些基础语法
前言: 本篇将结束c的一些基础的语法,方便在以后的博客中出现,后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍;其次,我们需要知道c是建立在c的基础上的,所以c的大部分语法都能用在c上。 目…...
mysql 技术100问?
什么是软件架构?它的定义和目的是什么?软件架构设计的基本原则是什么?请解释一下模块化架构和分层架构的区别。为什么重视可伸缩性在软件架构中的作用?请讨论一下微服务架构和单体应用架构的区别和优劣。如何选择适合项目的软件架…...
APK漏洞扫描工具
一、APKDeepLens是一个基于python的工具,旨在扫描Android应用程序,专门针对OWASP TOP 10移动漏洞。 工具:python3.8或者以上版本 安装 git clone https://github.com/d78ui98/APKDeepLens/tree/main cd /APKDeepLens python3 -m venv venv…...

ReactNative项目构建分析与思考之react-native-gradle-plugin
前一段时间由于业务需要,接触了下React Native相关的知识,以一个Android开发者的视角,对React Native 项目组织和构建流程有了一些粗浅的认识,同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…...
LeetCode454 四数相加
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入:nums1 [1,2], nu…...

Kafka消费者重平衡
「(重平衡)Rebalance本质上是一种协议,规定了一个Consumer Group下的所有Consumer如何达成一致,来分配订阅Topic的每个分区」。 比如某个Group下有20个Consumer实例,它订阅了一个具有100个分区的Topic。 正常情况下&…...

【线代基础】张量、向量、标量、矩阵的区别
1、标量(Scalar) 纯数字,无方向性、无维度概念。因此也叫 标量张量、零维张量、0D张量 例如,x18,x21.34 x1、x2即为标量 2、张量(tensor) 具有方向性,可以理解为一个多维数组&a…...

用chatgpt写论文重复率高吗?如何降低重复率?
ChatGPT写的论文重复率很低 ChatGPT写作是基于已有的语料库和文献进行训练的,因此在写作过程中会不可避免地引用或借鉴已有的研究成果和观点。同时,由于ChatGPT的表述方式和写作风格与人类存在一定的差异,也可能会导致论文与其他文章相似度高…...

字节跳动也启动春季校园招聘了(含二面算法原题)
字节跳动 - 春招启动 随着各个大厂陆续打响春招的响头炮,字节跳动也官宣了春季校园招聘的正式开始。 还是那句话:连互联网大厂启动校招计划尚且争先恐后,你还有什么理由不马上行动?! 先来扫一眼「春招流程」和「面向群…...

二,几何相交---4,BO算法---(3)数据结构
数据结构分两块,一个是某一时间状态的局部相交线段。一个是事件队列,是某一时刻局部相交线段的集合。...
中间件MQ面试题之Kafka
MQ相关面试题 Kafka面试题 (1)rockermq和kafka 的区别在哪里? 使用场景有什么不一样? 不同点: 数据可靠性 不同: RocketMQ:支持异步实时刷盘、同步刷盘、同步复制、异步复制;kafka:使用异步刷盘方式,异步复制/同步复制。性能对比:kafka单机写入TPS比较高单机支持…...

Prometheus 安装部署
文章目录 1.部署Prometheus1.1.修改配置文件1.2.配置告警规则1.3.运行Docker 2.部署Alertmanager2.1.修改配置文件2.2.Prometheus监控配置2.3.运行Docker 3.部署Grafana3.1.运行Docker3.2. 配置数据源3.3. 配置dashboard 开源中间件 # Prometheushttps://iothub.org.cn/docs/m…...
龙芯杯赛道-学习过程记录
Preface&免责声明: 由于参赛资料企业并未开源,所以我不能开放出有关参赛的资料 但是我会在这里记录参赛时看不懂的一系列知识补充 ------------------------------------------------------------------------------------------------------- TSEN…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...