【Linux】自动化构建-make/Makefile

一、初识make和makefile

1、概念

make:是一个命令

makefile:一个文件

make是一个命令行工具,其核心功能是根据预先定义的规则,自动操作。就比如我们提前预设好的一个流程,然后通过make去完成。

makefile是一个文本文件,其就好比如我们的流程图,其中设定好了我们要操作的内容。其是make的操作手册。

通过make来调用makefile文件,然后过程的实现在makefile文本文件中写。

2、makefile文件编写

首先我们要知道一个概念:依赖关系和方法

依赖关系:就是你想要达成某个事件必须要涉及的对象

依赖方法:达成这个事件所使用的方式

下面我们来就看看makefile文件的编写:

如上,我们使用vim打开makefile,然后进行编写。

text.s是我们要达成的目标,然后我们要生成text.s那么就要将text.c文件进行编译才能得到,所以text.c就是这个目标中的依赖关系文件。

然后下面的gcc -o就是我们的依赖方法了。

然后就是运行完成后,这个项目是要从内存中清理掉的,所以clean这个就是做清理工作。然后我们的清理工作基本都是放在工程完成的后面。

我们还可以将clean使用.PHONY修饰clean或者目标文件,这样这个方法就总是会被执行:

下面是make的几个细节:

细节1:依赖关系必须存在,依赖文件列表可以为空

细节2:依赖方法可以是任何的shell命令

细节3:clean命令其只是利用了make的自动推导能力,让他执行了rm命令,在构建工程的视角, 看起来就是清理项目,清理项目本质就是删除不再需要的临建文件

细节4:make命令,其后面可以跟目标名,后面跟谁就解析谁的依赖关系和依赖方法,make默认 只会推导一条完整的推导链路,然后make只会推导第一个依赖关系对应的推导链。

然后我们还有更加特别的方式:

我们可以用@代表目标文件,然后^代表依赖关系,用@修饰方法可以使得我们在执行make的时候不显示我们具体执行的命令:

可以看到使用make clean就没有显示执行的命令了,然后我们的code.i文件就被删除了。

然后还有更绝的方式:

那么我们上面的方式,就可以只写一个方法,然后将Bin和SRC的进行修改即可了。

二、make的工作原理

首先我们来看一个推导过程:

首先我们的make的执行是从makefile的上执行到下的,那么我们一开始是没有cdd.o文件的,那么按照我们的直觉,这里应该直接进行报错,那么我们执行是会发现其没有进行报错的。

运行结果:

make的具体工作原理如下:

1、make会在当前目录下找名字为Makefile或者makefile的文件

2、如果找到,那么它会找文件中的第一个目标文件,在我们上面的例子中其会找cdd这个文件, 并且把这个文件当作最终的目标文件

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

对于文件的生成时间,我们可以使用touch测试。

4、如果cdd所依赖的cdd.o文件不存在,那么make就会在当前文件中找目标为cdd.o文件的依赖 性,如果找到,那么就按照规则生成cdd.o文件

三、第一个系统程序-进度条

1、缓冲区

首先我们来认识一个键:回车键

我们在平时按回车键,实际上是完成的两个动作:回车,换行

回车:将光标移动到当前行的开始。符号\r

换行:将光标移动到下一行的同一列/。符号\n

缓冲区:

操作系统会在内存中开辟一个临时存储的区域,我们学习C语言的第一个程序输出hallo world。

程序是运行到这一行就输在屏幕上输出hallo world的吗?

其实不是,其会先将程序处理数据存储到缓冲区中,程序运行完毕,然后再输出结果,那么要是我们需要立马显示结果呢?

那么使用\n就会触发刷新缓冲区。

如下:

2、实现一个简单的倒计时程序

我们的倒计时程序的要求是,只在一行进行输出,然后要覆盖前面输出的字符。

那么我们再来认识一个函数:

fflush

这个函数是C语言标准库中提供的一个函数,其作用是强制刷新输出流的缓冲区,将缓冲区中存储的数据立即写入到对应的设备。

然后我们每次对倒计时的数据进行输出的时候,要回到行的初始位置。

代码如下:

然后我们通过前面学习的make来进行编译。

运行结果:

3、进度条实现

进度条的实现就是利用我们的缓冲区 原理来实现,通过我们的换行回车操作实现。

代码如下:

相关推荐
大博士.J6 小时前
视频号主体违规与认证上限?正确的解决方式
运维·python·自动化
hey you~7 小时前
400电话选型技术测评:一个开发视角的线路质量评估方案
运维·网络·数据库·400电话·企业通信
筱羽_筱羽7 小时前
跟着“Ubuntu18.04/20.04编译Linux5.10.76+Xenomai-3.2.1+IgH”教程遇到的问题
linux·运维·ubuntu
DolphinScheduler社区7 小时前
Apache DolphinScheduler 6 月治理优化,补齐调度运维全链路细节
大数据·运维·云原生·apache·海豚调度
法外狂徒18 小时前
将 Pi Agent 接入 HagiCode 的实践之路
服务器·前端·人工智能
ShineWinsu8 小时前
对于Linux:基于UDP实现简单聊天室功能
linux·c++·面试·udp·笔试·进程·简单聊天室
Dovis(誓平步青云)8 小时前
《精讲Spring Boot后端跑另一个端口:如何解决暴露服务器问题》
服务器·人工智能·spring boot·后端·生成对抗网络
流量猎手9 小时前
Vscode登陆服务器
服务器·ide·vscode
zoipuus9 小时前
上传repo仓库到自己的gitlab
linux·gitlab·shell·全志·tina
IT大白鼠9 小时前
CVE-2026-7531 Azure Linux MariaDB PQC 内存破坏漏洞详解
linux·mariadb·azure·cve-2026-7531