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…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
