(1)
.c.o 相当于 %o:%c
src = $(wildcard ./*.c): 匹配当前工作目录下的所有.c 文件。将文件名组成列表,赋值给变量 src。 src = add.c sub.c div1.c
obj = $(patsubst %.c, %.o, $(src)): 将参数3中,包含参数1的部分,替换为参数2。 obj = add.o sub.o div1.o
clean:
-rm -rf $(obj) a.out “-”:作用是,删除不存在文件时,不报错。顺序执行结束。
$@: 在规则的命令中,表示规则中的目标。
$^: 在规则的命令中,表示所有依赖条件。
$<: 在规则的命令中,表示第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则。
模式规则:
%.o:%.c
gcc -c $< -o %@
静态模式规则:
$(obj):%.o:%.c
gcc -c $< -o %@
使用静态模式规则,就是指定模式规则给谁用,这里指定模式规则给obj用,以后文件多了,
文件集合会有很多个,就需要指定哪个文件集合用什么规则
(2)
-I 指定头文件所在目录位置
-c 只做预处理,编译,汇编。得到二进制文件
-g 编译时添加调试文件,用于gdb调试
-Wall 显示所有警告信息
-D 向程序中“动态”注册宏定义
-l 指定动态库库名
-L 指定动态库路径
(3)
OBJS=abc.o abd.o abe.o
CC=gcc
CFLAGS=-g -Wall -c
myexe:$(OBJS)
$(CC) $^ -o $@ # $^ 是指":"右边的所有.o;$@指左边要生成的目标文件
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@ # 生成上面需要的.o文件
clean:
$(RM) *.o myexe -r # 删除.o和myexe
(4)
用伪目标来解决使用"make clean"时makefile去执行clean文件等类似问题,添加一行 .PHONY: clean ALL