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

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(MyProjectVERSION 1.0DESCRIPTION "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.mzph.cn/pingmian/49838.shtml

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

相关文章

oracle数据库下的定时任务,如何创建Jobs

oarcle中写存储过程&#xff0c;上面的文章中已经介绍过了&#xff0c;这次是写好存储过程后&#xff0c;在Jobs文件夹中新建job,达到定时执行任务的目的。 1、在plsql数据库中&#xff0c;找到左边的Jobs,右键点击新建&#xff0c;如下图&#xff1a; 2、按照下图将相应的项添…

【Gitlab】SSH配置和克隆仓库

生成SSH Key ssh-keygen -t rsa -b 4096 私钥文件: id_rsa 公钥文件:id_rsa.pub 复制生成的ssh公钥到此处 克隆仓库 git clone repo-address 需要进行推送和同步来更新本地和服务器的文件 推送更新内容 git push <remote><branch> 拉取更新内容 git pull &…

LINUX高性能服务器框架

1.服务器模型&#xff1a; 1). C/S模型 &#xff1a; 此模型就是一个服务器能给多个客户端提供服务&#xff0c;但所以资源都被服务端所占有&#xff0c;客户端想要获取只能通过请求连接服务端去获取。由于客户端的请求访问是异步的&#xff0c;所以需要一个手段进行此类事件的…

基于微信小程序的课堂考勤系统的设计与实现(论文+源码)_kaic

基于微信小程序的课堂考勤系统的设计与实现 摘 要 在高校教育普及的今天&#xff0c;学生人数日益增多&#xff0c;为保证课堂质量&#xff0c;教师多要在课前进行考勤。因此本设计提出基于微信小程序的课堂考勤系统&#xff0c;增加了定位功能&#xff0c;避免了“假打卡”…

前端开发知识(一)-html

1.前端开发需掌握的内容&#xff1a; 2.前端开发的三剑客&#xff1a;html、css、javascript Vue可以简化JavaScpript流程。 Element&#xff08;饿了么开发的&#xff09; &#xff1a;前端组件库。 Ngix&#xff1a;前端服务器。 3.前端开发工具&#xff1a;vscode 1)按…

基于Java+SpringBoot+Vue的学生心理咨询评估系统

前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽兄弟们&#xff0c;好久不见哦&#xff5…

乐尚代驾六订单执行一

加载当前订单 需求 无论是司机端&#xff0c;还是乘客端&#xff0c;遇到页面切换&#xff0c;重新登录小程序等&#xff0c;只要回到首页面&#xff0c;查看当前是否有正在执行订单&#xff0c;如果有跳转到当前订单执行页面 之前这个接口已经开发&#xff0c;为了测试&…

Linux嵌入式学习——数据结构——线性表的链式结构

线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。 特点&#xff1a; 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占…

四、单线程多路IO复用+多线程业务工作池

文章目录 一、前言1 编译方法 二、单线程多路IO复用多线程业务工作池结构三、重写Client_Context类四、编写Server类 一、前言 我们以及讲完单线程多路IO复用 以及任务调度与执行的C线程池&#xff0c;接下来我们就给他结合起来。 由于项目变大&#xff0c;尝试解耦项目&#…

47.简易电压表的设计与验证(2)

&#xff08;1&#xff09;Verilog 代码&#xff1a; module adc_collect(input clk ,input reset_n ,input [7:0] adc_data ,output clk_adc );wire clk_adc_a ;…

提交高通量测序处理数据到 GEO --- 操作流程

❝ 写在前面 由于最近在提交课题数据到 NCBI 数据库&#xff0c;整理了相关笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. 提交高通量测序数据到 GEO --- 说明书 2. 提交高通量测序原…

基于机器学习的二手房价格分析与预测设计与实现

概述 随着西安房地产市场的不断发展和变化&#xff0c;对二手房价格的准确预测变得至关重要。本研究旨在利用机器学习技术对西安市二手房价格进行深入分析与预测&#xff0c;通过对原始数据进行数据预处理和特征提取&#xff0c;以构建有效的预测模型。通过数据分析和可视化&a…

LabVIEW学习-LabVIEW处理带分隔符的字符串从而获取数据

带分隔符的字符串很好处理&#xff0c;只需要使用"分隔符字符串至一维字符串数组"函数或者"一维字符串数组至分隔符字符串"函数就可以很轻松地处理带分隔符地字符串。 这两个函数所在的位置为&#xff1a; 函数选板->字符串->附加字符串函数->分…

第13周 简历职位功能开发与Zookeeper实战

第13周 简历职位功能开发与Zookeeper实战 本章概述1. Mysql8窗口函数over使用1.1 演示表结构与数据1.2 案例1:获取男女总分数1.3 案例2****************************************************************************************本章概述 1. Mysql8窗口函数over使用 参考案例…

从零开始学习机器学习,掌握AI未来的关键!

从零开始学习机器学习 1. 介绍1.1 人工智能&#xff08;AI&#xff09;概述1.2 机器学习在人工智能中的应用1.3 机器学习基础概念 2. 监督学习2.1 什么是监督学习2.2 回归分析2.3 分类问题2.4 模型评估和选择 3. 无监督学习3.1 什么是无监督学习3.2 聚类算法3.3 降维技术 4. 深…

Elasticsearch 7.x入门学习-Java API操作

1 创建项目 在idea开发工具中创建Maven项目 修改 pom 文件&#xff0c;增加 Maven 依赖关系 <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</versi…

C语言 | Leetcode C语言题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; /* 求和运算 */ /* 对[0,n]求和, 减去数组每个元素, 得出丢失的元素 */ int missingNumber(int* nums, int numsSize){int i;int sum numsSize;for (i 0; i < numsSize; i) {sum i - nums[i];}return…

每天五分钟计算机视觉:目标检测模型从RCNN到Fast R-CNN的进化

本文重点 前面的课程中,我们学习了RCNN算法,但是RCNN算法有些慢,然后又有了基于RCNN的Fast-RCNN,Fast R-CNN是一种深度学习模型,主要用于目标检测任务,尤其在图像中物体的识别和定位方面表现出色。它是R-CNN系列算法的一个重要改进版本,旨在解决R-CNN中计算量大、速度慢…

python-阶乘和(赛氪OJ)

题目描述 求Sn​1!2!3!4!5!⋯n!的值&#xff0c;其中 &#x1d45b;n 是一个数字。输入格式&#xff1a; 输入一个整数 n。输出格式&#xff1a; 输出对应的 Sn​。 样例输入输出样例输入 5样例输出 153数据范围 对于 100% 的数据&#xff0c;保证1≤n≤20。来源/分类&#xff…

接口自动化测试框架实战-4-日志方法封装

上一小节我们讲解了文件读写方法的封装方法&#xff0c;本小节我们完成一下框架日志的封装方法。 首先我们讲解一下日志封装和日志记录有哪些用处&#xff1f; 更加方便的设置日志的格式和输出方式全局方法可以各个类/函数中都能统一调用分类记录接口用例执行日志&#xff0c…