一、初步认识make和Makefile
我们首先需要知道的是,make是一个命令,Makefile是一个文件,Makefile中包含了依赖关系和依赖方法。
从上面的文件以及指令中我们可以看到,我们可以在Makefile文件中写入依赖关系以及对应的依赖方法,Makefile文件保存退出后,在命令行中执行make,就可以自动帮我们执行依赖关系中的方法(如上所示,可以形成mybin可执行文件)。但需要注意的是,Makefile文件名不要写错。
make和Makefile形成目标文件的时候,默认是执行第一条依赖方法,如果要执行第二或者第三条依赖方法,需要再make后加上依赖关系名。
二、补充:Linux中的三个时间
access:访问该文件的时间,access时间可能不是实时更新的
modify:最后一次修改该文件内容的时间
change:最后一次修改该文件属性的时间
三、 make和Makefile语法的认识
.PHONY 目标文件:修饰目标文件,使之成为一个伪目标,其对应的依赖方法在每次调用时总是被执行,但该语法一般只推荐对清除的依赖方法使用,不推荐对一般的编译依赖方法使用。
在Makefile中,可以用$@表示目标文件,$^表示源文件,效果和写成目标文件和源文件是一样的。
这种替换方法其实可以引申到Makefile中一般的变量替换,这其实有点类似于C/C++中的宏替换。
四、基于make和Makefile的进度条代码的实现
//Makefile processbar:processbar.c main.c gcc -o $@ $^ .PHONY:clean clean: rm -f processbar
//processbar.h #include <stdio.h> #define NUM 103 #define Body '=' #define Head '>' typedef void (*callback_t)(double);//回调函数 void process_flush(double rate);
//processbar.c #include "processbar.h" #include <string.h> #include <unistd.h> const char *lable="|/-\\"; char buffer[NUM] = {0}; void process_flush(double rate) { static int cnt = 0; int n = strlen(lable); if(rate <= 1.0) { buffer[0] = Head; } printf("[%-100s][%.1f%%][%c]\r", buffer, rate, lable[cnt%n]); //buffer为进度条,rate为比率,lable为旋转光标 fflush(stdout);//\r为回车,不会将缓冲区的内容自动刷新到屏幕上,需要用fflush刷新 buffer[(int)rate] = Body; if((int)rate + 1 < 100) { buffer[(int)(rate+1)] = Head; } if(rate >= 100.0) { printf("\n"); } cnt++; cnt %= n; }
//main.c #include "processbar.h" #include <time.h> #include <stdlib.h> #include <unistd.h> #define FILESIZE 1024*1024*1024 void download(callback_t cd) // 回调函数 { srand(time(NULL)); int total = FILESIZE; while(total) { usleep(10000);//下载 int one = rand() % (1024*1024*10); total -= one; if(total < 0) { total = 0; } //当前进度 int download = FILESIZE - total; double rate = (download*1.0/(FILESIZE))*100.0; cd(rate);//调用回调函数打印 } } int main() { download(process_flush); return 0; }
运行结果如下: