Linux的Makefile进度条

2024-07-29 08:29:22 浏览数 (2)

1、makefile的语法

1、1、特殊符号含义

代码语言:javascript复制
$@:代表的就是目标文件 
$^:代表的是整个依赖文件列表。可以是多个,也可以是一个。(按照原文依赖文件列表的多少来判断)

由此就能够证明

@和

^代表的含义。

1、2、变量定义

不需要定义变量的类型。直接使用。 使用之后make也能够直接替换变量内容。

那为什么我们需要定义变量呢?就像是在C语言中的宏一样,以后的这个基本就不会改变了,就只是会在定义的时候发生变化,这样能够简化操作。学着学着就能够感受到好处了!

1、3、消除提示语句

在依赖关系的前面加上@符号,这样就能够在执行make的时候不出现提示,make clean的时候也不会提示。

1、4、提示过程状态

如果想要实现这样的情况的话,不提示编译过程的细节,只显示编译的概括的话该怎么做呢? 我们需要在Makefile中增加一些特别的语句来帮助我们。

2、对make执行细节的理解

其中gcc直接一部能够实现 .c文件的编译。但是如果想要完全实现gcc的过程的话应该是像上图所示那样一步一步的进行。

同时,如果还想要clean的话,就需要删除多个文件。

所以这样的话,整个代码也就能够实现了。 但是实现已经实现了,现在的问题就是,我们在Makefile中写的gcc从上到下是osi的过程,但是make的时候却是iso的过程。这又是为什么呢? 那是因为在make的时候虽然默认是从上到下扫描,但是扫描完第一行之后发现没有code.o文件,由于code.o没存在,所以make先继续向下找,直到找到最后一行的时候才开始返回。就类似于像是递归一样,没有找到返回条件的时候就需要继续向深层次继续递归。当满足条件时,一步一步再向上返回。 makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。 如果推导过程有错误的话,会在make的时候提示错误,没有办法实现目标文件。 如果我们把文件中Makefile的步骤颠倒顺序还能够生成最终的文件了吗? 需要根据情况判断。如果说第一行的目标文件是code.exe的话,那么最后还是可以形成。但是如果code.i放在最开始的话,就很大概率上实现不了code.exe。所以这也就意味着,我们想要实现的文件一定要放在开头,这样的话,能够保证最后能够生成,如果不放在开头的话,可能最后由于推导到过程不需要,最后反而是成不了你所需要的文件。 但是其实没必要对于gcc每一步都要实现。

3、进度条小程序设计

3、1、回车和换行

为了方便能够能够理解换行和回车的理解。可以想象一个老式的打印机,换行表示的就是从当前位置直接到下一行。回车才是让当前位置回到第一列。

代码语言:javascript复制
n->换行 回车
r->回车

3、2、缓冲区

对于这样一个code.c来说的话,执行的结果是先sleep3秒,最后再显示这句话, 但是如果在printf的语句内的结尾加上n的话,是先显示这段话,然后再sleep3秒。 那么这两句话到底是谁先执行,谁后执行? 答案的话是先执行printf。 1、在sleep期间,printf又在哪呢?在缓冲区内—一段内存空间。 2、但是为什么有的时候printf并不是在sleep之前打印的呢?那正是因为printf的内容在缓冲区内,有n的话会直接刷新缓冲区,让内容显示在显示器上。所以没有n的时候,系统还没来得及让printf内容从缓冲区出来显示到显示器上就开始sleep了。 缓冲区内的内容一般会在程序结束的时候进行缓冲区的冲刷。这也是为什么没有n的时候,先sleep3秒。 其次,还有一种情况也会让缓冲区刷新。那就是缓冲区满了的时候。

所以理解了之前的情况的话,我们来看看下面的情况。

先只会打出一行

然后才会打出

还有一种强制刷新的方法

代码语言:javascript复制
fflush命令

stdin->键盘。stdout stderr->显示器

这样也能够不利用n,来帮助我们实现缓冲区的刷新。 为什么缓冲区是行刷新? 其实不然,我们输入的时候就是不一样的地方,他就是一个一个的刷新。 但是由于为了满足显示器是个人看的前提,总不能所有的东西全部输完了才显示,所以显示器为了中和利用缓冲区的效率和为了方便人,所以显示才决定了一个中间的做法,那就是进行行刷新。

4、实现倒计时

根据上面的知识,能不能弄一个倒计时呢? 首先倒计时的话,不能像是之前那样子一样,直接就是printf打印从9到0,因为这样子的话不算是倒计时,如果不相信可以自己打印试试。 那么根据之前学到的强制刷新缓冲区以及r让光标返回到开头这也就能够实现让数字在一个位置出现,换句话说是覆盖之前的打印在屏幕上的数字。 具体的细节是

5、进度条实现

5、1、Version1版本进度条

利用上面介绍的回车啊,换行啊,缓冲区刷新啊,等一系列操作的话,这样就能够实现进度条。

代码语言:javascript复制
sleep:休眠按照秒为单位
usleep:休眠按照微秒为单位

1s=1*106us 这里为了掩饰进度条的效果,就不让休眠的时间太长了,每次都休眠短一点,让效果更加明显一点。

写一下能够实现简单的进度条的运行。 可是这也就只是进度条显示的多少,那么比例呢?还有就是在变化的时候是不是在Windows的上面鼠标还会变成旋转的图标。 我们能不能在Linux上也实现这样的操作呢?实现旋转光标。

这样的话就实现了第一版本的进度条了。

5、2、Version2版进度条

由于进度条不是单独出现。会根据网速以及文件大小的不同,都会影响进度条的变化。 所以进度条是根据文件目标的大小和下载的大小动态的显示一个进度条的大小。

根据文件大小的不同,来判断时间的长短。

0 人点赞