【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、进度条实现

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

代码如下:

相关推荐
顶点多余2 小时前
Linux“信号“从硬件到软件详解
linux·运维·服务器
勘察加熊人2 小时前
ai飞卢小说自动化处理工作流获得提问素材
运维·自动化
瀚高PG实验室3 小时前
rpm包安装报错:cannot open Packages index using db5 - Cannot allocate memory (12)
linux·运维·服务器·瀚高数据库
云计算老刘3 小时前
2. DNS 服务器
运维
水星灭绝3 小时前
win11+wsl2+docker
运维·docker·容器
追风少年王大爷丶3 小时前
nginx 配置无域名访问拒绝
运维·服务器·nginx
AI+程序员在路上3 小时前
嵌入式软件技术大全
linux·开发语言·arm开发·单片机
black方块cxy3 小时前
实现一个输入框多个ip以逗号分隔最多20组,且ip不能重复
java·服务器·前端
Snasph4 小时前
在Ubuntu上进行端口转发
linux·运维·ubuntu