Makefile与make是配套使用的
编写Makefile需要知道一个规则,两个函数,三个变量
一、一个规则
定义:若想生成目标,需要检查目标中的依赖条件是否存在,如不存在,需要寻找是否有规则生成该依赖文件。
检查规则中的目标是否需要被更新,必须检查他所有的依赖,依赖中任何一个被更新,则目标被更新。
编写Makefile的格式:
目标文件:依赖条件
(一个Tab缩进)命令
例子:
1、hello:hello.c
gcc hello.c -o hello
然后使用 make 该目录下就会生成 hello
2、hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
然后使用 make 该目录下就会生成 hello.o 和 hello
此时需要注意 make编译命令的编译过程,make编译是有一定顺序的,比如执行第一句的时候判断,需不需要其他依赖条件,不需要则就执行第一句,需要则往下寻找依赖条件,执行下面的命令
hello.o:hello.c
gcc -c hello.c -o hello.o
hello:hello.o
gcc hello.o -o hello
这个顺序是不能够执行第二句命令的
二、两个函数
1、src = $(wildcard *.c) //$()是取变量值的意思
找到当前目录下所有后缀名为.c的文件赋值给src,即匹配当前目录下的所有.c文件,并赋值给src
例如:src = a.c b.c c.c d.c
2、obj = $(patsubst %.c,%.o, $(src))
将src 变量里所有后缀为.c的文件替换成.o,即将参数三中,包含参数一的部分,替换成参数二
例如:obj = a.o b.o c.o d.o
补充 :
clean:
-rm -rf $(obj) a.out
shell命令:make clean //将会删除所有.o文件
三、三个自动变量
1、$@:在规则的命令中,表示规则的目标
2、$<:在规则的命令中,表示第一个依赖条件
如果将该变量应用在模式规则中,他可将依赖条件列表中的依赖依次取出,套用模式规则
3、$^:在规则的命令中,表示所有依赖条件
一个规则中的例二可以改成:
hello:hello.o
gcc $< -o $@
hello.o:hello.c
gcc $< -o $@
补充:模式规则
%.c:%.o
gcc -c $< -o $@