一、初识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、进度条实现
进度条的实现就是利用我们的缓冲区 原理来实现,通过我们的换行回车操作实现。
代码如下:
