一、简单介绍make/Makefile
Makefile 和 makefile 不区分大小写,但是一定只能是 “makefile” !!!
make
是一个指令,makefile
是一个文件。
Makefile 格式形式:
- 使用 make 生成目标文件时,默认从上到下扫描 Makefile 文件,默认形成的是第一个目标文件——默认只生成一个。
二、进度条的设计与实现
进度条应与实际的业务结合,单独存在没有意义。因此,下面模拟了一个下载场景,结合下载场景完成进度条的设计。
【Makefile 文件】
processbar:test.o processbar.o
gcc -o $@ $^
test.o:test.c
gcc -c test.c
processbar.o:processbar.c
gcc -c processbar.c
.PHONY:clean
clean:
rm -f processbar test.o processbar.o
【processbar.h】
1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <time.h>
6
7
8 #define MAX 103
9
10 #define Head '>'
11 #define Body '='
12
13 void process_fflush(double rate);
【processbar.c】
1 #include "processbar.h"
2
3
4 char* spit = "-\\|/";
5
6 char buff[MAX] = {0};
7 void process_fflush(double rate)
8 {
9 static int cnt = 0;
10 int n = strlen(spit);
11 if (rate < 0.5) buff[0] = Head;
12
13 printf("[%-100s][%.1f%%][%c]\r", buff, rate, spit[cnt%n]);
14 fflush(stdout);
15 buff[(int)rate] = Body;
16 if ((int)rate < 99) buff[(int)rate + 1] = Head;
17
18 cnt++;
19
20 if (rate >= 100.0) printf("\n");
21 }
【test.c】
1 #include "processbar.h"
2
3 #define FILE_SIZE 1024*1024*1024
4
5 void download()
6 {
7 int total = FILE_SIZE;
8 srand(time(NULL)^1023);
9 while (total)
10 {
11 usleep(20000);
12 int one = rand()%(2 * 1024 * 1024);
13 total -= one;
14 if (total < 0)
15 total = 0;
16
17 int download = FILE_SIZE - total;
18 double rate = (download * 1.0 / (FILE_SIZE)) *100;
19 process_fflush(rate);
20 }
21 }
22
23 int main()
24 {
25 download();
26 return 0;
27 }