构建生成工具cmake的使用(1)

news2024/9/22 11:34:54

ps:本文是对cmake的基础讲解,掌握后解决70-80%情况是足以应对的,后续会对cmake有进阶内容。

一 前言

CMake 是一个工具,帮助开发者管理和自动化软件项目的构建过程。它使用一个叫做CMakeLists.txt 的文本文件来描述项目的组织结构、编译选项和依赖关系。这个工具的优点是开源且具有移植性好。                                                                                                                           简单举个例子,我们在Linux上编写C/C++程序,在编写完成后需要使用gcc对源文件手动编译。如果项目中的文件比较少的情况下,可以每次通过命令手动编译。但是如果一个程序需要用到100,1000个文件难道每次还要自己手动写吗,就要借助构建生成工具有两种解决方案:1)Makefile 2)cmake

1.1 cmake 和 Makefile

二者都是构建生成工具,cmake比Makefile更高级,cmake跨平台性更好,Makefile 可能会涉及到有关操作系统和编译器的命令和语法,这使得同一个项目在不同平台上可能需要不同的 Makefile 语法。

1.2 cmake的基本流程

  1. 编写 CMakeLists.txt 文件:在项目的目录下创建一个名为 CMakeLists.txt 的文件,这个文件描述了项目的构建信息,包括项目名称、源文件、依赖库等。

  2. 生成构建文件:在项目的构建目录(可以是在源码目录外的任何位置)执行 cmake +CMakeLists.txt文件相对于现在位置的所在路径 命令来生成相应的构建系统文件。见下面的例子中:因为我们是在编写CMakeLists.txt文件的同级目录下创建的build目录,所以相对于build的目录来说CMakeLists.txt就是在上一级中,所以加上 .. 语句。

mkdir build
cd build
cmake ..

这会在当前的 build 目录下生成适合于当前平台的一套构建生成文件

  3. 生成可执行程序:可以通过执行 make 命令,就可以生成一个目标文件在指定的目录下。这里的make就是操作的Makefile文件,学过Makefile的同学比较清楚。

二 简单使用

2.1 CMakeLists.txt 文件编写时三个基础指令及执行cmake文件命令

cmake最重要的就是编写 CMakeLists.txt 文本文件,三个基础指令                                                  

cmake_minimum_required(xxx) //指定可以执行此 CMakeLists.txt 文本文件的最低cmake版本,如果安装的cmake版本小于指定的版本,就不会被执行.可写可不写.

project(xxx) 通过 project 命令可以指定项目的名称、版本号和编写语言等.但是我们一般只写一个项目名称就可以了,没必要写后面的.
project(MyProject
    VERSION 1.0
    DESCRIPTION "A sample C++ project"
    LANGUAGES CXX //CXX就是C++的意思
)

add_executable(目标程序名称, 依赖的源文件) //如果依赖多个源文件,用空格隔开或者用 : 隔开

 用cmake +要执行的 CMakeLists.txt 文件路径就会生成一堆文件,这里面最重要的就是Makefile,再执行make就会生成源文件对应的可执行程序文件。

2.2 注释的使用

单行注释是 #       多行注释是#[[ ]] 将注释的内容写在框框之中

 2.3 set的用法                                                          

set是用来定义变量的,cmake下一切皆字符串string

set(var value) 
var为变量名,value是变量值

 在变量定义好了之后,怎么使用变量呢?

${value} 这样使用一个变量

set的三个主要用处:                                                                                                                          1)如果一个可执行程序生成要用到多个源文件,就可以用set提高效率。

2)指定编译时使用的C++标准

 设置 CMAKE_CXX_STANDARD 这个宏就相当于指定了C++标准,11代表C++11。当然不止这一种方式还有一种方式:在执行cmake指令时指定

 3)指定生成的可执行程序路径,就是生成的可执行程序存在哪个地方

set(EXECUTABLE_OUTPUT_PATH XXX)
EXECUTABLE_OUTPUT_PATH和指定C++标准一样,是个固定语法,后面跟路径即可,绝对路径和相对路径都可以,如果指定的路径不存在的话,会帮忙一层层创建出来

 另外说一句,cmake和Makefile有个区别是,Makefile会根据修改时间判断要不要重新生成,而cmake是只要生成了不删除就不会重新生成。

2.4 查找-保存目标目录源文件命令

有两种方式:分别是aux 和 file

aux_source_directory(dirpath var)
dirpath是查找某目录下的所有源文件,将所有源文件的名称以字符串形式保存在 var 变量中.

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型) 
GLOB 和 GLOB的区别在于:假如指定了一个目录,这个目录下还有子目录文件,GLOB_RECURSE会递归式查找目录,而GLOB不会
变量名是保存按条件搜索出来的文件名称
要搜索的文件路径和文件类型以空格为分割线 eg: ${src} *.cc 
文件路径不必多说,绝对路径和相对路径都可以. 文件类型就是想把什么类型的文件保存到变量中

PROJECT_SOURCE_DIR是个宏,在使用cmake +路径 生成一堆一堆cmake文件时,这个宏就是跟的那个路径。

2.5指定头文件查找路径 

在一个大项目中,源文件在一个目录下,头文件在一个目录下,源文件中包含头文件eg:#include<head.h> 会在源文件的同级目录下查找和在环境变量中查找,但是不想把头文件的目录路径加在环境变量中,就要在编写CMakeLists.txt文件中指定一下头文件查找路径。                    

 include_directories(xxx)

 将com.h头文件放到head目录下                                                                                                         

 指定了到head目录下查找需要用到的头文件

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

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

相关文章

matlab实验:实验六MATLAB 数值计算与符号运算

题目1&#xff1a;&#xff08;线性方程组数值求解&#xff09; 1&#xff0e; 用不同的方法求解下面方程&#xff1a;&#xff08;方程原式参考 P369 实验 10&#xff0c;第 1 题&#xff09; 第 1 种&#xff0c;左除和求逆函数(inv) 第 2 种 &#xff0c; 用 符 号 运 算 的…

大语言模型-对比学习-Contrastive Learning

一、对比学习概念 对比学习是一种特殊的无监督学习方法。 旨在通过拉近相关样本的距离并且推远不相关样本的距离&#xff0c;来学习数据表示。 通常使用一种高自由度、自定义的规则来生成正负样本。在模型预训练中有着广泛的应用。 二、对比学习小案例 对比学习主要分为三个…

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍&#xff1a; Clipper2在Github上的地址&#xff1a;https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集&#xff08;Intersection&#xff09;、并集&#xff08;Union&#xff09;、差分&#xff08;Difference&…

Llama 3.1超大405B!AI巨浪再掀新高潮

前沿科技速递&#x1f680; Meta公司宣布开放的Llama 3.1系列模型&#xff0c;以其惊人的128K上下文长度、对八种语言的支持以及业界领先的405B开放式最前沿AI模型&#xff0c;瞬间吸引了全球科技界的目光。该系列模型不仅在通用知识、可控性、数学、工具使用和多语言翻译等方面…

探索算法系列 - 双指针

目录 移动零&#xff08;原题链接&#xff09; 复写零&#xff08;原题链接&#xff09; 快乐数&#xff08;原题链接&#xff09; 盛最多水的容器&#xff08;原题链接&#xff09; 有效三角形的个数&#xff08;原题链接&#xff09; 查找总价格为目标值的两个商品&…

鸿蒙开发—黑马云音乐之广告页

目录 1.页面布局 2.点击按钮跳转 3.倒计时自动跳转 接下来是项目实战&#xff0c;项目选用传智的黑马云音乐。 效果图如下&#xff1a; 1.页面布局 Entry Component struct ADPage {State message: string Hello Worldbuild() {Stack({alignContent:Alignment.TopEnd}) {…

Axure中继器实战篇:让数据展示和交互设计更上一层楼!

Axure中继器实战篇:让数据展示和交互设计更上一层楼! 前言 经过了前两章的学习,接下来我们去模拟的实际场景开启实战篇,以下是界面 1.前期准备 前期把页面准备好后,给中继器的每个单元格命名为了方便数据绑定的操作。 为了演示我准备了几十行数据,建议也多准备一点。…

学习Java的日子 Day56 数据库连接池,Druid连接池

Day56 1.数据库连接池 理解&#xff1a;池就是容器&#xff0c;容器中存放了多个连接对象 使用原因&#xff1a; 1.优化创建和销毁连接的时间&#xff08;在项目启动时创建连接池&#xff0c;项目销毁时关闭连接池&#xff09; 2.提高连接对象的复用率 3.有效控制项目中连接的…

vue 搜索框

效果 创建搜索组件&#xff1a; 在Vue项目中&#xff0c;首先需要创建一个搜索组件。这个组件通常包含一个输入框和一个搜索按钮。使用v-model指令将输入框与组件的数据属性&#xff08;如searchKeyword&#xff09;进行双向绑定&#xff0c;以便获取用户输入的关键词。处理搜索…

Linus: vim编辑器的使用,快捷键及配置等周边知识详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 vim的安装创建新用户 adduser 用户名Linus是个多用户的操作系统是否有创建用户的权限查看当前用户身份:whoami** 怎么创建设置密码passwdsudo提权(sudo输入的是用户…

锁相环 vivado FPGA

原理 同步状态/跟踪状态&#xff1a;相位差在2kπ附近&#xff0c;频率差为0到达上述状态的过程称为捕获过程锁相环的捕获带&#xff1a;delta w的最大值&#xff0c;大于这个值的话就不能捕获鉴相器&#xff08;PD-phase discriminator&#xff09;&#xff1a;相乘加LPF&…

从0到1使用Docker部署java项目详解

Docker部署Java项目相比传统部署方式&#xff0c;在环境一致性、配置管理、可扩展性和安全性等方面具有显著优势。然而&#xff0c;它也带来了学习成本、资源消耗和复杂度增加等挑战。 云服务器 白嫖阿里云服务 通过免费试用方式获取自己的阿里云服务器。当然&#xff0c;如…

SQL-REGEX-常见正则表达式的使用

SQL-REGEX-常见正则表达式的使用 在SQL中&#xff0c;正则表达式&#xff08;Regex&#xff09;的使用可以帮助进行更灵活和精确的模式匹配和数据筛选。不同的数据库管理系统对于正则表达式的支持略有差异&#xff0c;但大体都是相似的。 Tips&#xff1a; 模式描述匹配内容…

优选算法之前缀和(上)

目录 一、【模板】一维前缀和 1.题目链接&#xff1a;DP34【模板】前缀和 2.题目描述&#xff1a; 3.解法&#xff08;前缀和&#xff09; &#x1f343;算法思路&#xff1a; &#x1f343;算法代码&#xff1a; 二、【模板】二维前缀和 1.题目链接&#xff1a;DP35【…

海外短剧CPS分销推广系统平台源码搭建方案介绍

随着全球内容消费市场的日益繁荣&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;正在迅速赢得全球观众的喜爱。特别是当国内短剧以其独特的创意和精湛的制作技艺&#xff0c;吸引了大量海外观众的关注时&#xff0c;短剧出海成为了国内影视行业的一大趋势。接下来为大家介…

HarmonyOS三方库的使用

系统组件难以提供比较优秀的界面&#xff0c;需要第三方库来实现一些比较好看的界面效果 三方库的获取&#xff1a; 开源社区支持OpenHarmony-TPC 和 Openharmony三方库中心仓 先目前已经拥有各种各样的三方库&#xff0c;包括UI 图片 动画 网络 数据存储 工具类 多媒体 安全等…

Cookie与Session 实现登录操作

Cookie Cookie 是网络编程中使用最广泛的一项技术&#xff0c;主要用于辨识用户身份。 客户端&#xff08;浏览器&#xff09;与网站服务端通讯的过程如下图所示&#xff1a; 从图中看&#xff0c;服务端既要返回 Cookie 给客户端&#xff0c;也要读取客户端提交的 Cookie。所…

Android开发中使用Base64类库进行密码加密报错解决

在对密码加密采用sdk自带类库Base64加密时&#xff0c;函数可跳转&#xff0c;能够索引到类函数位置&#xff0c;但是运行出现报错。 使用情况&#xff1a; 引用&#xff1a;import java.util.Base64; 调用&#xff1a;String decode new String(Base64.getEncoder().encod…

实战练习之Linux上实现shell脚本自动化编程

实验拓扑要求 主机环境描述 注意&#xff1a; 172.25.250.101-172.25.250.105 共 5 个 IP 地址由servera.exam.com服务器进行提供。172.25.250.106 由 serverb.exam.com 服务器进行提供。 需求描述 1. 172.25.250.101 主机上的 Web 服务要求提供 www.exam.com Web站点&#…

模拟ADG主库归档文件丢失,备库出现gap(增量备份解决)

文章目录 一、说明二、环境信息2.1.主备库环境信息2.2.检查主备是否同步正常 三、模拟日志断档3.1.模拟主库归档文件丢失3.2 查看主库状态出现GAP 四、RMAN增量备份恢复备库同步4.1 RMAN增量恢复备库4.2 开启备库redo同步4.3 主备库验证同步 一、说明 模拟Oracle主库归档文件丢…