Linux基础开发工具之Linux自动项目构建工具的使用

news2024/12/23 5:48:45

目录

前言

1.make/makefile

1.1 依赖关系/依赖方法

2.原理

3.项目清理

 4.make的执行问题

 5.相关简单的符号介绍

总结


前言

  之前给大家介绍了我们在开发过程中所需要使用到的编辑器vim,以及编译器gcc/g++的使用,但是我相信大家在使用过程会发现我们在每次编写好一份代码时总是需要每次去调用gcc/g++的相关指令去编译,那么如果我们具有了多份代码时,我们还需要一个一个去编写就显得非常的麻烦,那么我们今天要学的相关工具就会免去我们在这个方面的很多工作。


1.make/makefile

    学习我们的自动项目构建工具学习的就是我们对make以及makefile这个工具的使用,而会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
   一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
    make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
 从本质来讲我们的make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

那么我们如何去使用我们这个工具呢?那么首先就需要我们自己去创建一个makefile文件。

 那么创建好这个文件后,我们后续需要做什么操作呢?为了让大家更好的理解

1.1 依赖关系/依赖方法

 这里我们如何去理解这个依赖关系和依赖方法呢?这里我就简单的给大家举一个例子:

首先我们先创建一个文件写一份代码:

 这里我们对makefile进行配置:

 这里我们可以看到我们对我们hello.c到hello运行程序进行了编写,那么这里我们的依赖关系就是:

 那么我们的依赖方法对应的就是每行依赖关系对应得下一行:

也就是: gcc  -option hello.* -option hello.*

                rm - fr hello.i hello.s hello.o hello

那么我们编写好得makefile文件该如何使用呢?这里我们使用make指令看看效果:

 这里我们使用make指令可以发现我们这里产生了我们编译的各个过程所对应的文件,那么这里我们调用我们的可执行程序看看运行结果如何:

 这里我们可以发现我们的程序执行无误,那么我们此处的原理又是什么呢?

2.原理

1.首先make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件

3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新,那么,他就会执行后面所定义的命令来生成hello这个文件。

 4.如果hello所依赖的hello.o文件不存在那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明make的终极任务,也就是执行文件hello了。
6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

那么总结的来说就是我们在调用make指令该会自动推导makefile中的依赖关系,去产生我们的目标文件。

3.项目清理

这里我们产生了一堆文件,但是我们的工作也是需要被清理的,这个清理过程就需要我们调用我们先前就编写好的clean

也就是

这里我们发现我们的清除程序调用方式是make +clean ,那么这里的原因是什么呢?这里有个小知识需要我们去了解一下:

make从顶向下扫描,默认将第一个作为make指令,后续的就需要我们使用make+文件名,就如我们需要使用make  clean达到清理效果

但是一般我们的clean目标文件我们一般将其设置为伪目标,也就需要使用.PHONY关键字去修饰。

这里我们为什么需要使用.PHONY关键字去修饰clean呢?首先我们需要知道的就是我们的.PHONY关键字的作用就是让我们无论在什么情况下都能被执行,那么也就是说我们的依赖关系并不是在什么情况下都能执行的,而是需要一定条件的,所以我们不建议把形成可执行逻辑用伪目标修饰,但是就是我们的清理程序是我们要求每次都要被执行的,所以我们一般用伪目标关键字去修饰clean。

所以我们简单的修改一下我们的makefile文件:

 4.make的执行问题

我们之前说我们的make并不是在任何情况下都能执行的,这里我给大家实验一下:

 这里我们在第一次执行过make后发现我们第二次并不能执行了,而且上面提示我们hello是更新了的,那么原因是什么呢?首先我们需要知道我们make在执行所对应的依赖关系是需要我们操作系统付出代价的,在我们源文件没有改变的情况下,我们再次编译得到可执行程序也是不变的,那么我们再次make得到的可执行程序是没有意义的,我们的操作系统也不允许这样的事情发生。

那么如果要在是make有效就需要我们修改我们的源文件内容,而这个过程实际上就是修改了我们源文件的相关时间,从而我们的源文件时间就比我们的可执行程序文件更新,这样子我们就可以产生新的可执行程序,所以我们可以说我们的make指令是否有效实际上就是我们的源文件时间是否比我们的可执行程序文件更新。

而我们的文件又分为三个时间,分别是:

access指的是我们的访问时间

modify指的是我们对文件内容进行修改的时间

change指的是我们对文件属性进行修改的时间

我们可以使用stat指令去查看相关时间信息:

  这里需要给大家简单的说明一下这里我们由于访问我们文件的是非常频繁的所以修改access时间会影响我们的整机效率,所以在我们现在的操作系统中access的修改并不是每次都需要修改而是要达到一定的条件(每个操作系统的不一样)。

那么我们对我们的源文件进行修改实际上就会更改我们的Modify时间,但是在修改源文件的过程中一般我们文件属性相关的内存也会发生相关变化所以我们的Change的时间也会发生变化。

那么我们就简单的给大家演示一下,这里我们对我们的源文件内容进行修改:

 这里我们发现我们的时间发生了改变,那么我们调用我们的make指令看看效果:

可以发现我们的make成功了。

此外为了验证我们的程序编译成功和我们内容变化没有关系我们可以使用我们的touch指令去修改相关时间:

 这里我们看到我们的时间发生了变化,那么调用我们的make指令看看效果:

 可以发现我们的make指令也成功了,此外我们可以使用touch+对应的选项去修改我们的对应的时间,也就是:

-a更新访问时间,-m更新修改内容时间(这里我们的change时间也会随着改变)

 5.相关简单的符号介绍

 总体来讲我们的make小编已经给大家讲解的大差不差了,但是这里还有几个符号需要大家去使用理解一下:

$@:表示的是我们依赖关系左边的简写

 $^:表示的是我们依赖关系右边的简写

 @:如果我们不想让我们使用make时我们的依赖方法显示到屏幕上,只需要我们在我们的依赖方法的第一行加上@即可

 #:mikefile中的注释


总结

 对于内容呢,小编就给大家介绍到这里了关键是需要大家平时多使用加深影响并且学习,才能掌握我们的LInux操作系统的相关内容。|
 


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

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

相关文章

报错注入(主键重复)攻击原理

基本原理 利用数据表中主键不能重复的特点,通过构造重复的主键,使得数据库报错,并将报错结果返回到前端。 SQL说明函数 以pet数据表为例进行说明 rond(): 返回[0,1)区间内的任意浮点数。 count(): 返回每个组的列行数。 如&#xff0…

电商API接口的作用,发展意义

电商API接口的作用是实现电商平台与第三方应用或系统之间的数据交互和功能调用。通过API接口,第三方开发者可以从电商平台获取商品信息、订单信息等数据,并进行相关操作,如创建订单、支付、物流查询、评价等。同时,电商平台也可以…

SpringBoot MDC全局链路解决方案

需求 在访问量较大的分布式系统中,时时刻刻在打印着巨量的日志,当我们需要排查问题时,需要从巨量的日志信息中找到本次排查内容的日志是相对复杂的,那么,如何才能使日志看起来逻辑清晰呢?如果每一次请求都…

Mybatis批处理、Mysql深分页

一、Mybatis批量操作 1、Foreach方式 会拼接成:insert into table (ID, PHONE,MESSAGE) values (?,?,?), (?,?,?), (?,?,?) 当数据过多时,可能生成的动态sql过大,mysql默认仅1M的sql字符串,过长可能会执行失败。 在sql循…

桌面端UI自动化测试如何让SplitButtonControl展开

原始SplitButtonControl图 从图中鼠标所指的控件属性为: ControlType(控件类型): SplitButtonControl ClassName(类名): SplitButton AutomationId(自动化ID): esri_geoprocessing_Pyt…

【ChatGLM】大模型之 ChatGLM 微调

目录 1. 微调方法 2. 全量参数微调 3. P-tuning v2 4. LoRA 1. 微调方法 全参数微调 对模型全量参数进行训练。 P-tunning v2 前缀微调,在模型每一层都增加前缀,只训练这部分的参数,训练量明显小于全量微调。 LoRA 基于矩阵分解的微调&…

记录线上一次mysql只能查询,不能插入或更新的bug

错误复现 突然有一天产品通知xx服务不可用,想着最近也没有服务更新,就先排查一下服务日志 使用postman测试的时候请求明显超时,查看日志显示是一个锁的问题 使用工具连接到mysql,查看information_schema.INNODB_TRX,发现有一个事…

flink+kafka+doris+springboot集成例子

目录 一、例子说明 1.1、概述 1.1、所需环境 1.2、执行流程 二、部署环境 2.1、中间件部署 2.1.1部署kakfa 2.1.1.1 上传解压kafka安装包 2.1.1.2 修改zookeeper.properties 2.1.1.3 修改server.properties 2.1.1.3 启动kafka 2.1.2、部署flink 2.1.2.1 上传解压f…

LabVIEW开发高压配电设备振动信号特征提取与模式识别

LabVIEW开发高压配电设备振动信号特征提取与模式识别 矿用高压配电设备是井下供电系统中的关键设备之一,肩负着井下供配电和供电安全的双重任务,其工作状态直接影响着井下供电系统的安全性和可靠性。机械故障占配电总故障的70%。因此,机械故…

论文浅尝 | 面向多步推理任务专业化较小语言模型

笔记整理:张沈昱,东南大学硕士,研究方向为自然语言处理 链接:https://github.com/FranxYao/FlanT5-CoT-Specialization 动机 本文的动机是探索如何在多步推理任务中通过大型语言模型提升较小的语言模型的性能。作者认为&#xff0…

hive 字段注释乱码

hive 字段注释乱码: 在mysql中运行: alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;OK

Nginx与docker配置安装

目录: Nginx的安装配置: 1、安装依赖包: 2、下载Nginx安装包: 3、解压Nginx压缩包: 4、配置Nginx编译环境: 5、编译并安装Nginx: 6、安装完Nginx后,可以切换到Nginx的安装目录…

对任意类型数都可以排序的函数:qsort函数

之前我们学习过冒泡排序&#xff1a; int main() {int arr[] { 9,7,8,6,5,4,3,2,1,0 };int sz sizeof(arr)/sizeof(arr[0]);int i 0;for (i 0; i < sz-1; i) {int j 0;for (j 0; j < sz-1-i; j) {if (arr[j] > arr[j 1]){int temp 0;temp arr[j];arr[j] ar…

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面&#xff0c;挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用&#xff0c;需要在里面支持多个版本的中间件客户端&#xff1b;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT&#xff0c;百度&#xff0c;googl…

深度补全算法-CompletionFormer-已开源效果最好

《CompletionFormer: Depth Completion with Convolutions and Vision Transformers 》 摘要 给定稀疏深度和相应的 RGB 图像&#xff0c;深度补全旨在整个图像中空间传播稀疏测量值&#xff0c;以获得密集的深度预测。尽管基于深度学习的深度补全方法取得了巨大进步&#xff0…

NAND Flash 失效之 Data Rentention | 闪存数据保持力 | 数据放几年就坏掉了?

依公知及经验整理,原创保护,禁止转载。专栏 《深入理解Flash:闪存特性与实践》 图1: Data Retention 对 Vt 电压分布影响 图片来源: 知乎 [2] 全文 1900 字, 内容摘要 Data Retention 产生 Data Retention 的影响因素  如何规避 Data Rention 问题 发生Data Retent…

Vue + VSCode + 浏览器显示乱码

浏览器乱码&#xff1a; 将GBK改为UTF-8: 欧克:

领航优配:沪指震荡涨0.47%,保险、券商板块强势,互联金融概念活跃

4日早盘&#xff0c;两市股指高开高走&#xff0c;沪指一度涨逾1%打破3300点&#xff0c;随后涨幅有所收窄&#xff1b;两市半日成交超6000亿元&#xff0c;北向资金小幅净流入。 截至午间收盘&#xff0c;沪指涨0.47%报3295.91点&#xff0c;深成指涨0.67%&#xff0c;创业板指…

CrossOver是什么软件 CrossOver软件好用吗

CrossOver是一款由CodeWeavers公司开发的软件&#xff0c;它可以在Mac和Linux等操作系统上运行Windows软件&#xff0c;而无需在计算机上安装Windows操作系统。这款软件的核心技术是Wine&#xff0c;它是一种在Linux和macOS等操作系统上运行Windows应用程序的开源软件。本文将会…

github pages 用法详解 发布自己的网站

github pages 基础用法 URL 规则 假设你的 github 帐号为 mygithub&#xff0c;需要发布的仓库名为 myrepo&#xff0c;那么 pages 的 URL 为&#xff1a; https://mygithub.github.io/myrepo 添加内容 用任意编辑器写好&#xff08;或者生成&#xff09;标准的网页内容&a…