Makefile:
在标准的编译过程中,源文件先被编译成目标文件,再由目标文件连接成可执行文件
1,基本格式:
target(目标文件):依赖文件 命令
例子:
test:test.o add.o sub.o gcc test.o add.o sub.o -o test test.o:test.c gcc -c test.c add.o:add.c gcc -c add.c sub.o:sub.c gcc -c sub.c
2,自定义变量:
定义: 变量名=变量值
引用变量: $(变量名) 或者${变量名}
makefile的变量名:(1)以数字开头,(2)敏感大小写,(3)变量一般都在makefile的头部定义
例子:
#变量 OBJS=add.o sub.o test.o TARGET=test $(TARGET):$(OBJS) gcc $(OBJS) -o $(TARGET) add.o:add.c gcc -c add.c -o add.o sub.o:sub.c gcc -c sub.c -o sub.o test.o:test.c gcc -c test.c -o test.o clean: rm -fr $(OBJS) $(TARGET)
3,自动变量
$@:表示规则中的目标
$<:表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项
例子:
#变量 OBJS=add.o sub.o mul.o div.o test.o add.o TARGET=test CC=gcc #$@: 表示目标 #$<: 表示第一个依赖 #$^: 表示所有的依赖 $(TARGET):$(OBJS) #$(CC) $(OBJS) -o $(TARGET) $(CC) $^ -o $@ echo $@ echo $< echo $^ add.o:add.c $(CC) -c $< -o $@ sub.o:sub.c $(CC) -c $< -o $@ mul.o:mul.c $(CC) -c $< -o $@ div.o:div.c $(CC) -c $< -o $@ test.o:test.c $(CC) -c $< -o $@ clean: rm -rf $(OBJS) $(TARGET)
4,模式规则
%.o:%.c $(CC)-c $(CFLAGS) $(CPPFLAGS) $< -o 例子: OBJS=test.o add.o sub.o mul.o div.o TARGET=test $(TARGET):$(OBJS) gcc $(OBJS) -o $(TARGET) %.o:%.c gcc -c $< -o $@
makefile中的函数有很多,介绍两个最常用的。
wildcard – 查找指定目录下的指定类型的文件
src = $(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src
patsubst – 匹配替换
obj = $(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o
在makefile中所有的函数都是有返回值的。
例子:
SRC=$(wildcard *.c) OBJS=$(patsubst %.c, %.o, $(SRC)) TARGET=test $(TARGET):$(OBJS) gcc $(OBJS) -o $(TARGET) %.o:%.c gcc -c $< -o $@
6. Makefile中的伪目标
clean用途: 清除编译生成的中间.o文件和最终目标文件
make clean 如果当前目录下有同名clean文件,则不执行clean对应的命令
Ø 伪目标声明: .PHONY:clean
声明目标为伪目标之后,makefile将不会该目标是否存在或者该目标是否需要更新
clean命令中的特殊符号:
-
“-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”
-
“@”不显示命令本身,只显示结果。如:“@echo clean done”
例子:
SRC=$(wildcard *.c) OBJS=$(patsubst %.c, %.o, $(SRC)) TARGET=test $(TARGET):$(OBJS) gcc $(OBJS) -o $(TARGET) %.o:%.c gcc -c $< -o $@ .PHONY:clean clean: rm -rf $(OBJS) $(TARGET
总结:1,分析各个目标和依赖之间的关系
2,根据依赖关系自底向上执行命令