1. 好处
一次编写,终身受益
2. 命名规则
-
makefile
-
Makefile
3. 三要素
-
目标
-
依赖
-
规则命令
4. 第一版makefile
目标:依赖
tab键 规则命令
makefile:
5. 第二版makefile
第一版更改其中一个文件,所有源码都重新编译
5.1 改进
- 可以考虑编译过程分解,先生成 .o 文件,然后使用 .o 文件变成结果
5.2 定义变量
Makefile隐含规则:默认处理第一个目标
5.3 函数
-
wildcard:可以进行 文件匹配
-
patsubst:内容的替换
# get all .c file
SrcFiles=$(wildcard *.c)
# ObjFiles 定义目标文件
ObjFiles=main.o add.o minu.o mul.o
# 目标文件用法
app.out:$(ObjFiles)
gcc -o app.out -I./include *.o
main.o:main.c
gcc -c main.c -I ./include
add.o:add.c
gcc -c add.c -I ./include
minu.o:minu.c
gcc -c minu.c -I ./include
mul.o:mul.c
gcc -c mul.c -I ./include
test:
echo $(SrcFiles)
5.4 makefile变量
-
$@: 代表 目标
-
$^ : 代表全部 依赖
-
$< : 第一个依赖
-
$? : 第一个变化的依赖
# get all .c file
SrcFiles=$(wildcard *.c)
# all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))
# 目标文件用法
app.out:$(ObjFiles1)
gcc -o app.out -I./include $(ObjFiles1)
%.o:%.c
gcc -c $< -I ./include
test:
echo $(SrcFiles)
echo $(ObjFiles1)
5.5 添加清理功能(@在规则前作用)
# get all .c file SrcFiles=$(wildcard *.c) # all .c files ---> .o files ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles)) # 目标文件用法 app.out:$(ObjFiles1) gcc -o app.out -I./include $(ObjFiles1) # 模式匹配规则, $@,$<这样的变量,只能在规则中出现 %.o:%.c gcc -c $< -I ./include -o $@ test: echo $(SrcFiles) echo $(ObjFiles1) # 添加清理功能 clean: @rm -f *.o # 加 @表示指令不输出 rm -f app.out
5.6 “-”的作用
该条规则报错,仍然继续执行
5.7 防止有歧义, 定义伪目标
.PHONY:clean # clean是一个伪目标,不是真正要得到的目标
5.8 总结
# get all .c file SrcFiles=$(wildcard *.c) # all .c files ---> .o files ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles)) all:app.out # 目标文件用法 $@: 目标;$<: 依赖 app.out:$(ObjFiles1) gcc -o $@ -I./include $(ObjFiles1) app.out1:$(ObjFiles1) gcc -o $@ -I./include $(ObjFuiles1) # 模式匹配规则, $@,$<这样的变量,只能在规则中出现 %.o:%.c gcc -c $< -I ./include -o $@ test: echo $(SrcFiles) echo $(ObjFiles1) # 定义伪目标,防止有歧义 .PHONY:clean # 添加清理功能 clean: -@rm -f *.o # 加 @表示指令不输出 rm -f app.out
make -f xxx:指定文件