⭐️上一篇博客介绍了Linux环境下的文本编辑工具,软件包管理工具,编译代码和调试代码的工具,这篇博客我还要介绍有关项目自动化构建工具——make/Makefile。
用简短的语言描述make和Makefile两个工具就是:make是一条指令,Makefile是一个文件。
几点介绍:
依赖关系: 依赖关系指明了两个文件之间的依赖性。例如test.o文件的生成要依赖test.s。
依赖方法: 依赖方法就是怎么做。test.o形成需要多test.s进行汇编,即gcc -c test.s -o test.o。
先看下面一串代码:
#include
int main()
{
printf("hello makefile\n");
return 0;
}
在该文件的同目录下创建一个makefile或Makefile的文件。
打开Makefile文件,进行规则的编辑:
第一行中冒号左边的mytest是目标文件,该目标文件依赖于冒号右边的test.c而产生,所以第一行写的是依赖关系,第二行一个tab键之后写上两个文件的依赖方法。第四行**.PHONY** 后面跟着clean,旨在说明clean是一个伪目标,伪目标后面是没有依赖的文件的,且它的特性是:总是可被指向的。想前面的make使用一次后,第二次使用是不被执行的,要使用make clean做一个工程清理的工作。
make的原理:
回车与换行
认真观察上面两段代码,代码1有\n,代码2没有\n。
代码1现象:
代码2现象:
仔细观察,可以发现第二段代码是先睡眠5s才进行打印的,但事实上,睡眠5s这行代码是在打印后面的,为什么会有限睡眠5s这种现象呢?难道是这里先执行sleep函数再执行打印语句吗?
答案显然不是这样的,这里就有一个行缓冲区的概念在这里。对于C语言级别的缓冲区而言,任何字符串都会先保存在这个缓冲区里面,等待刷新在显示屏上。但是显示器刷新是属于行刷新,就是遇到‘\n’就进行刷新。所以现在我们就理解了,代码2中没有’\n’,要打印的字符串一直保存在了C语言级别的缓冲区,只有程序运行快结束是才会把这些字符串刷新在屏幕上。
那我们应该怎样对代码2进行理解刷新呢?我们可以在打印一起后面加上:
fflush(stdout);
这里的意思是刷新标准输出流,这里指的是显示器。
所以修改后代码如下:
代码运行结果如下:
代码如下:
#include
#include
#include
int main()
{
char bar[101];
memset(bar,'\0', sizeof(bar));
char* lable = "|/-\\";
int i = 0;
while (i <= 100)
{
printf("[%-100s][%2d%][%c]\r", bar, i, lable[i%4]);
fflush(stdout);
usleep(50000);
bar[i] = '#';
++i;
}
printf("\n");
return 0;
}