目录
1.为什么需要makefile
主要是项目比较大时,方便多人一起开发,管理和编译工程。
2.makefile基本的格式
target: prerequisites
cmd
3.makefile 工作流程
-step1:读入所有的makefile。
-step2:读入被include的其它makefile。
-step3:初始化文件中的变量。
-step4:推导隐晦规则,并分析所有规则。
-step5:为所有的目标文件创建依赖关系链。
-step6:根据依赖关系,决定哪些目标要重新生成。
-step7:执行生成命令
4.基本写法案例
有一个工程,三个 .c文件,分别为 main.c add1.h add1.c add2.h add2.c ,需要编译生成一个 add.out 的可执行文件
按照格式 编写如下:
#格式
#target:prerequisites
# cmd
#
add.out : main.o add1.o add2.o
gcc main.o add1.o add2.o -o add.out
main.o : main.c
gcc main.c -c -Wall -g -o main.o
add1.o : add1.c
gcc add1.c -c -Wall -g -o add1.o
add2.o : add2.c
gcc add2.c -c -Wall -g -o add2.o
编写makefile后,只有生成的文件被修改后,才会需要重新编译。
但是我们经常想要重新编译,这个时候,我们会在makefile中,增加一条命令clean命令,见如下代码。
#格式
#target:prerequisites
# cmd
#
add.out : main.o add1.o add2.o
gcc main.o add1.o add2.o -o add.out
main.o : main.c
gcc main.c -c -Wall -g -o main.o
add1.o : add1.c
gcc add1.c -c -Wall -g -o add1.o
add2.o : add2.c
gcc add2.c -c -Wall -g -o add2.o
clean:
rm *.o add.out -rf
5.升级写法案例
基本写法只是为了更好让我们理解编译过程,但是文件之间的关联关系需要自己去区分,当工程足够大的时候,对我们来说管理太复杂了,因此需要进一步说明升级写法。
同样基于上面案例说明
高级写法的特点之一,就是用变量以及通配符匹配的一些方式,来省略我们自己去手动区分管理文件关联关系。
如上面 我们定义变量 OBJS = main.o add1.o add2.o ,取变量的值使用符号 $ ,其中注意下 变量RM 相关于 rm -f
变量替换方式案例
#格式
#target:prerequisites
# cmd
#
OBJS = main.o add1.o add2.o
CC = gcc
CFLAGS += -c -Wall -g
add.out : $(OBJS)
$(CC) $(OBJS) -o add.out
main.o : main.c
$(CC) main.c $(CFLAGS) -o main.o
add1.o : add1.c
$(CC) add1.c $(CFLAGS) -o add1.o
add2.o : add2.c
$(CC) add2.c $(CFLAGS