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

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

代码如下:

相关推荐
蹉跎岁月新4 分钟前
Jenkins创建一个maven-project
运维·jenkins·maven
zincsweet9 分钟前
C++ 实现进程池:主从架构、管道通信与任务调度
linux·c++
草莓熊Lotso15 分钟前
【CMake】静态库的编译、链接与引用全解析
linux·c语言·数据库·c++·软件工程·cmake
原来是猿15 分钟前
性能测试(1)
运维·服务器·python·压力测试
郝学胜-神的一滴16 分钟前
CMake 012:Linux 下动态库与可执行程序的单文件构建
linux·服务器·开发语言·c++·软件构建·cmake
为思念酝酿的痛9 小时前
POSIX信号量
linux·运维·服务器·后端
专业白嫖怪9 小时前
什么是docker
运维·docker·容器
隔窗听雨眠10 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
人还是要有梦想的10 小时前
linux下用搜狗输入法,中英文切换
linux·运维·服务器
北京智和信通10 小时前
某部队IT基础设施及机房动环统一运维建设实例
运维·网管平台·网管软件·网络管理系统·网络运维平台·网络运维系统