2.1 什么是Makefile
一个企业级项目,通常会有很多源文件,有时也会按功能、类型、模块分门别类的放在不同的目录中,有时候也会在一个目录里存放了多个程序的源代码。这时,如何对这些代码的编译就成了个问题。Makefle就是为这个问题而生的,它定义了一套规则,决定了哪些文件要先编译,哪些文件后编译,哪些文件要重新编译。makefile就像一个Shell脚本一样,可以实现“自动化编译”,一旦写好,只需要一个make命令,完全自动编译,极大的提高了软件开发的效率。
整个工程通常只要一个make命令就可以完成编译、链接,甚至更复杂的功能。可以说,任何一个Linux源程序都带有一个Makefile文件。如果能掌握Makefile文件的编写方法,就能脱离可视化编译器,使用编译链工具编译出所需的目标文件。
2.2 Makefile的优点
管理代码的编译,决定该编译什么文件,编译顺序,以及是否需要重新编译;
节省编译时间。如果文件有更改,只需重新编译此文件即可,无需重新编译整个工程;
一劳永逸。Makefile通常只需编写一次,后期就不用过多更改。
2.3 Makefile的编写规则


2.4 创建工程目录&编写makefile内容


2.6 makefile的工作原理

2.7 进入工程目录makefile_tutorial当中执行make命令: 使用此命令即可按预定的规则生成目标文件

2.8 运行程序

2.9 Makefile的变量使用
其实,我们可以像 C 一样,用一个符号来代替一个字符串内容

我们用 OBJ 代替 main.o add.o sub.o mul.o div.o 这些文件。注意:在引用变量时,需要用 $() 来包括住变量。
2.10 清空编译文件
我们发现每次编译的过程中都会产生一大堆中间文件,这令人感到杂乱,每个 Makefile 中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。

.PHONY 意思表示 clean 是一个“伪目标”,在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。clean 的规则不要放在文件的开头,不然,这就会变成make 的默认目标,一般我们都会放在文件结尾处。
输入命令行:make clean 就可以清除对应的文件了


进到example01中执行test,输出hello world;然后我们删除这个可执行文件test,再执行make,然后就会重新编译test.c,生成test,然后再运行test,就会出现test的运行结果。
CC = gcc
main: main.c tool.o bar.o
$(CC) main.c tool.o bar.o -o main
tool.o: tool.c
$(CC) -c tool.c
bar.o: bar.c
$(CC) -c bar.c
clean:
rm *.o main
【 main的生成是要依赖main.c tool.o和bar.o】
【 $(CC) main.c tool.o bar.o -o main 前三个文件链接成main文件】
【 $(CC) -c tool.c 编译tool.c文件生成tool.o文件】
【 rm *.o main 把中间生成的文件和上一个生成的可执行文件删掉,要不会影响下一次编译】
【运行的话就输入./main命令】
【如果要想执行clean的话,必须输入命令make clean才会把中间结果和之前生成的main一并删掉】
OBJ = main.o add.o sub.o mul.o div.o
CC = gcc
app: $(OBJ)
$(CC) -o app $(OBJ)
main.o: main.c
$(CC) -c main.c
add.o: add.c
$(CC) -c add.c
sub.o:sub.c
$(CC) -c sub.c
mul.o: mul.c
$(CC) -c mul.c
div.o: div.c
$(CC) -c div.c
.PHONY : clean
clean :
-rm $(OBJ) app
app是要生成的目标文件;由$(OBJ)文件生成;
下述链接是makefile的详细讲解