文章内容如下:
1)make与Makefile的介绍
2)进度条小程序的编写
一。make与Makefile的介绍
make是一个命令,Makefile是一个文件。make和Makefile的价值是自动化构建项目。我们编写Makefile的最终目的是是为了构建项目,说人话就是我们想用Makefile把我的源代码编译,自动形成可执行程序。
Makefile是一个文件,其主要构成是依赖关系和依赖方法,makefile中第一句代码(不缩进写)为test:test.c,表示我想生成可执行程序test,它依赖于test.c文件,冒号左侧表示目标文件,冒号右侧表示依赖文件。
Makefile中第二句代码(必须在第二行缩进写)为写依赖方法,因为光有第一行的依赖关系还是不行的,那么怎么样才能从test.c形成test呢,很显然是gcc test.c -o test,因此第二行写gcc test.c -o test。
接下来我想编译mytest.c很简单直接make就ok,make之后它会自动调用我们刚刚所写的叫做Makefile的依赖方法,此时我们就形成了mytest。这就叫着makefile。光会构建项目还不行我们还得学会清理,所以在Makefile中继续写代码(不是必须在第三行)。第四行不缩进写.PHONY:clean第五行不缩进写clean:第六行缩进写rm -rf mytest。
首先我需要一个依赖关系文件,冒号左侧表示目标文件,冒号右侧表示依赖文件,所以我写clean:,clean名字随便取的没影响,依赖文件列表我们可以不依赖任何文件,即依赖文件列表为空,所以:右边没写,它的依赖方法叫rm -rf test,一般的我们约定俗成的喜欢给清理带上一个.PHONY:clean,这个PHONY是Makefile当中的一个类似于关键字的东西,用来表明clean是一个伪目标。Makefile中的test和clean我们都叫目标文件,我们把用.PHONY修饰的这样的目标文件clean叫着伪目标。保存退出后然后用make clean就把我们的代码清理掉了。
有时候我们在Makefile中需要编译的文件有很多,比如Makefile中:
hello:hello1.c hello2.c hello3.c
gcc hello1.c hello2.c hello3.c -o hello
这样写很麻烦,通常Makefile中写成下述形式:
hello:hello1.c hello2.c hello3.c
gcc $^ -o $@
其中$^指依赖文件hello1.c hello2.c hello3.c,$@指目标文件hello。
二。进度条小程序的编写
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4
5 #define NUM 102
6 int main()
7 {
8 char bar[NUM];
9 memset(bar,0,sizeof(bar));
10 int count = 0;
11 int b = 0;
12 const char* lable = "|/-\\";
13 while(count <= 100)
14 {
15 printf("[%-100s][%d%%][%c]\r",bar,count,lable[count %4]);
16 fflush(stdout);
17 if (1 == count)
18 {
19 bar[count++] = '>';
20 }
21 else
22 {
23 b = 0;
24 while(b < count)
25 bar[b++] = '=';
26 }
27 if(0 == count)
28 {
29 bar[count++] = ' ';
30 }
31 if(1 != count && 0 != count)
32 {
33 bar[count++] = '>';
34 }
35 usleep(100000);
36 }
37 printf("\n");
38
39
40
41
42 return 0;
43 }
1.15行代码中/r表示回车,回车后程序在缓冲区不一定能显示出来,所以用fflush(stdout)让代码显示在屏幕上。需要注意的是,换行(\n)是光标在什么位置另起一行,此时光标在上一次光标的正下方,回车(\r)是回到这一行的最开始。所以一般我们另起一行顶格是指回车换行;换行后是伴随着刷新的,回车后是没有刷新的,这也是为什么printf()中是\n能打印出结果,printf()中是\r不能打印出结果,因为\n把数据送到缓冲区后它后面有刷新所以数据随后从缓冲区出来显示在屏幕上了,而\r把数据送到缓冲区后没有刷新会经历一段较长的时间后再从缓冲区里出来,所以短时间内不能看见屏幕上的变化,要想马上看见变化,用fflush()函数fflush(stdout)刷新一下就可以了;
2. usleep(100000)是休眠函数,休眠10000微秒,约等于0.1秒;
3. %%在C语言中表示百分号;
4. [%100s]中的100是表示空留出100个空间,这样做是为了让][%d%%][%c]对应的内容固定住不随着=字符增加向右移动,目的一是为了看清百分比,二是让进度条美观。
5.[%-100s]中的-是为了左对齐,因为4中预留空间后默认是右对齐输出字符,这样进度条就从右向左跑了,肯定不行,加了-后默认左对齐,这是进度条就从左向右跑了。