命名方式
只有两种 makefile 和 Makefile,根本没有发挥空间
make执行makefile
makefile执行顺序
默认将第一行作为最终目标,找不到依赖的话才会向下查询,所以需要倒着写,一旦最终目标执行成功就会停止
a.out:hello.o add.o sub.o mul.o
gcc hello.o add.o sub.o mul.o -o a.out
hello.o:hello.c
gcc -c hello.c -o hello.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
可以使用ALL:目标,来改变执行目标
ALL:a.out
hello.o:hello.c
gcc -c hello.c -o hello.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
a.out:hello.o add.o sub.o mul.o
gcc hello.o add.o sub.o mul.o -o a.out
1个规则
每一组这个都是一个规则
目标:依赖条件
(必须是一个tab)命令
2个函数
src=$(wildcard *.c):匹配当前工作目录下的所有.c文件,将文件名组成列表赋值给srcobj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o:将参数3中包含参数1的部分替换成参数2
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
gcc $(obj) -o a.out
hello.o:hello.c
gcc -c hello.c -o hello.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
clean函数
- 在命令行使用
make clean -n查看clean里的内容,防止你写错 - 使用
make clean执行clean
clean:
-rm -rf $(obj) a.out
#rm前面的'-'是为了保证出错了依然执行,不然其中一个文件不存在,你全部删不了
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
gcc $(obj) -o a.out
hello.o:hello.c
gcc -c hello.c -o hello.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
clean:
-rm -rf $(obj) a.out
3个自动变量
$@:规则中的目标$<:规则中的第一个依赖。如果使用在模式规则中,他能将依赖列表的所有依赖依次取出,然后套用模式规则。$^:规则中的所有依赖组成的列表,以空格隔开,删除重复项
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
gcc $^ -o $@
hello.o:hello.c
gcc -c $< -o $@
add.o:add.c
gcc -c $< -o $@
sub.o:sub.c
gcc -c $< -o $@
mul.o:mul.c
gcc -c $< -o $@
clean:
-rm -rf $(obj) a.out
模式规则
因为上面的代码依然有大量的重复部分,使用一句话替代,这样你甚至不用改代码,只需要加文件就行
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
clean:
-rm -rf $(obj) a.out
静态模式规则 = 指定对找不到的依赖执行指定的模式规则
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
gcc $^ -o $@
$(obj):%.o:%.c #如果obj里的东西找不到,就执行这条规则
gcc -c $< -o $@
clean:
-rm -rf $(obj) a.out
伪目标
你看到clean没有依赖,加上伪目标保证执行 .PHONY: clean ALL
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
a.out:$(obj)
gcc $^ -o $@
$(obj):%.o:%.c #如果obj里的东西找不到,就执行这条规则
gcc -c $< -o $@
clean:
-rm -rf $(obj) a.out
.PHONY: clean ALL
添加自定义参数
src=$(wildcard *.c) #add.c sub.c mul.c hello.c
obj=$(patsubst %.c,%.o,$(src)) #add.o sub.o mul.o hello.o
ALL:a.out
myArgs= -g
a.out:$(obj)
gcc $^ -o $@ $(myArgs)
$(obj):%.o:%.c #如果obj里的东西找不到,就执行这条规则
gcc -c $< -o $@
clean:
-rm -rf $(obj) a.out
.PHONY: clean ALL