Makefile解析和简单的进度条实现

时间:2022-09-01 21:09:03

make和makefile简介:

make:是一个非常重要的编译命令,本质上它是一个程序。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那样会变的很麻烦。而make工具则可自动完成编译工作,并且可以只对在上次编译后修改过的部分进行编译。

        make是一个命令,

        makefile是一个文件。

make命令执行时,需要一个 Makefile文件,来告诉make命令需要怎么样的去编译和链接程序。

Makefile来告诉make命令如何编译和链接这几个文件。

我们的规则是:

1.如果这个工程没有编译过,那么我们的所有的文件都要编译并被链接。           

2.如果这个工程的某几个文件被修改,那么我们只编译被修改的文件,并链接目标程序。            

3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的的文件,并链接目标程序。


例如我们编写一个如下简单的test.c文件:

Makefile解析和简单的进度条实现


现在我们编写他的Makefile文件:

Makefile解析和简单的进度条实现


这样就写完了,我们只需make一下就可以了:

Makefile解析和简单的进度条实现


今天我们来用makefile来实现一个简单的小程序(进度条):

原理:

1 ,设置一个字符数组, 来保存输出的字符串。

2, 利用\r回车,使得每次光标回到最左边,覆盖之前的字符串。

3 ,没有\n 所以利用fflush刷新(stdout 强制从输出缓冲区输出到屏幕上)


我们打印进度条的时候,只打印一次,就是每一次刷新一次,所以这里就有一个缓冲区的问题。

那么什么是缓冲区呢?

我们这里说的缓冲区是标准输入,输出的缓冲区。当我们每次输输出,输入一个字符时,就要找CPU来处理,这样效率就会很低。所以标准输入输出就有一个缓冲区,用来存放数据,主要就是为了提高效率。

缓冲区的分类:全缓冲,行缓冲,无缓冲

全缓冲:这种缓冲方式要求填满整个缓冲区后才进行I/O系统调用操作。对于磁盘文件的操作通常使用全缓冲的方式访问。


行缓冲:在这种情况下,当在输入和输出中遇到换行符时,标准I/O库函数将会执行系统调用操作。当所操作的流涉及一个终端时(例如标准输入和标准输出),使用行缓冲方式。因为标准I/O库每行的缓冲区长度是固定的,所以只要填满了缓冲区,即使还没有遇到换行符,也会执行I/O系统调用操作。


无缓冲:无缓冲区是指标准I/O库不对字符进行缓存,直接调用系统调用。


在来看看\n和\r:

\n是换行,\r是回车,回车 = 光标到达最左侧,换行 = 移到下一行。

举个例子:

Makefile解析和简单的进度条实现

这个程序有\n,所以他会先输出“hello”,然后睡1s。


Makefile解析和简单的进度条实现

这个程序会先睡1s,在输出“hello”。


这其实就和上面讲过的缓冲区有关。

因为在C程序中缓冲区的方式是以行缓冲的方式刷新的,也就是说程序要在输入流中获取到一个行结束标志(换行或者是EOF)才会显示在输出屏幕上。


下面是进度条的实现:

Makefile解析和简单的进度条实现Makefile解析和简单的进度条实现Makefile解析和简单的进度条实现

下面是编写Makefile文件:

Makefile解析和简单的进度条实现


出来make一下,然后./test结果就出来了:

Makefile解析和简单的进度条实现


谢谢浏览,有错的地方请指出来,一起改进。