五十一. makefile的工作原理
相比较于五十中提到的第一种方法的弊端,这里提出改进的方法,首先是makefile文件的写法
然后是执行内容
[root@VM_0_15_centos Makefile]# ls
add.c div.c head.h main.c makefile mul.c sub.c
[root@VM_0_15_centos Makefile]# vim makefile
[root@VM_0_15_centos Makefile]# make
gcc main.c -c
gcc add.c -c
gcc sub.c -c
gcc mul.c -c
gcc main.o add.o sub.o mul.o -o app
[root@VM_0_15_centos Makefile]# ls
add.c add.o app div.c head.h main.c main.o makefile mul.c mul.o sub.c sub.o
[root@VM_0_15_centos Makefile]# ./app
sum = 26
[root@VM_0_15_centos Makefile]# rm app
[root@VM_0_15_centos Makefile]# ls
add.c add.o div.c head.h main.c main.o makefile mul.c mul.o sub.c sub.o
//显然在修改了add.c之后,我们再次make的时候,只有add.o和app对应的,被重新执行。
[root@VM_0_15_centos Makefile]# vi add.c
[root@VM_0_15_centos Makefile]# make
gcc add.c -c
gcc main.o add.o sub.o mul.o -o app
五十二. makefile中的变量
学到了这里之后,我们现在对之前比较冗余的makefile进行修改
改成这个后,使用make,出现app,仍然可以正常运行。
五十三. 自动变量和模式规则
上一节的makefile也可以进一步改写成
五十四. makefile中的函数
五十五. makefile中添加项目清理功能
现在我们先学习,当makefile中有多个目标时,如何只make指定目标
先修改makefile,然后敲入make hello
1 src = $(wildcard ./*.c)
2 obj = $(patsubst %.c, %.o, $(src))
3 target = app
4
5 $(target):$(obj)
6 gcc $(obj) -o $(target)
7
8 %.o:%.c
9 gcc -c $^ -o $@
10
11 hello:
12 echo "hello,makefile of hello"
明白这一点后,再在makefile中加入clean部分
1 src = $(wildcard ./*.c)
2 obj = $(patsubst %.c, %.o, $(src))
3 target = app
4
5 $(target):$(obj)
6 gcc $(obj) -o $(target)
7
8 %.o:%.c
9 gcc -c $^ -o $@
10
11 hello:
12 echo "hello,makefile of hello"
13
14 clean:
15 rm $(obj) $(target) -f
先make,再make clean
[root@VM_0_15_centos Makefile]# ls
add.c div.c head.h main.c makefile mul.c sub.c
[root@VM_0_15_centos Makefile]# make
gcc -c mul.c -o mul.o
gcc -c main.c -o main.o
gcc -c add.c -o add.o
gcc -c div.c -o div.o
gcc -c sub.c -o sub.o
gcc ./mul.o ./main.o ./add.o ./div.o ./sub.o -o app
[root@VM_0_15_centos Makefile]# ls
add.c app div.o main.c makefile mul.o sub.o
add.o div.c head.h main.o mul.c sub.c
[root@VM_0_15_centos Makefile]# ./app
sum = 26
[root@VM_0_15_centos Makefile]# make clean
rm ./mul.o ./main.o ./add.o ./div.o ./sub.o app -f
[root@VM_0_15_centos Makefile]# ls
add.c div.c head.h main.c makefile mul.c sub.c
接下来涉及到“伪目标”,
1 src = $(wildcard ./*.c)
2 obj = $(patsubst %.c, %.o, $(src))
3 target = app
4
5 $(target):$(obj)
6 gcc $(obj) -o $(target)
7
8 %.o:%.c
9 gcc -c $^ -o $@
10
11 hello:
12 echo "hello,makefile of hello"
13
14 .PHONY:clean
15 clean:
16 -mkdir /abc
17 -rm $(obj) $(target) -f