💣1.背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
💣2.原理
1.makefile存在的意义,是为了构建项目,就需要准备好
依赖关系和依赖方法
。
2. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 3. 如果找到,它会找文件中的第一个目标文件(target),在下面的例子中,他会找到“test”这个文件, 并把这个文件作为最终的目标文件。 4. 如果test文件不存在,或是test所依赖的后面的test.o文件的文件修改时间要比test这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。 5. 如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果 找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程) 6. 当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 test.o 文件声明 make的终极任务,也就是执行文件test了。 7. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文 件。 8. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。 9. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。
💣3.实例
💥4.1.依赖关系和方法
依赖关系 :
上面的文件 test ,它依赖 test.o test.o , 它依赖 test.s test.s , 它依赖 test.i test.i , 它依赖 test.c
依赖方法 :
gcc test就是与之对应的依赖关系
💥4.2.简单演示
指令touch makefile(Makefile)
vim编辑,写入依赖关系和依赖方法。
直接make指令就可以自动 通过makefile文件中的依赖关系和依赖方法进行构建项目
也可以清理指定文件:
马克默认执行第一个目标,make clean 就是执行clean。
.PHONY的解释:它修饰的伪目标总是被执行。其他啥都不管。
💥4.3.为什么普通目标知道自己是否被修改?
这就关系到文件的几个相关时间了。
指令:stat [文件名称]
通过比较两个文件(test和test.c)的内容修改时间(modify)来确认是否需要重新编译。
touch可以修改文件的时间到当前时间
touch 可以和 make配合使用。
所以.PHONY就是不要对比时间直接执行。不遵守这个规则。
💣4.Linux第一个小项目
先了解一下缓冲区的概念:
写一个进度条
源码:
#include <unistd.h>
#include <string.h>
int main()
{
int i = 0;
char bar[102];
memset(bar, 0 ,sizeof(bar));
const char *lable="|/-\\";
while(i <= 100 ){
printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
fflush(stdout);
bar[i++] = '#';
usleep(10000);
}
printf("\n");
return 0;
}
分开编译
test.c
test.h
main.c