1. Makefile的编写:
1>. makefile的命名
1. makefile
2. Makefile
2>. makefile中的规则
三部分:
目标(app):依赖(main.c a.c b.c)
命令(gcc main.c a.c b.c -o app)
gcc main.c a.c b.c -o app
执行 make 命令, 就会按照makefile中编写的规则编译整个项目
在makefile文件中可以有一个或多个规则
第一版本:
app:main.c sub.c mul.c add.c
gcc main.c sub.c mul.c add.c -o app
缺点: 修改一个程序, 重新make其他文件也会被重新编译
改进:
第二个版本:
makefile工作时候的原理:
1. 如果规则中的依赖不存在, 向下查找下边的规则, 使用找到的规则生成不存在的依赖.
2. 通过时间判断是否更新:
第一次: add.c -> add.o
第二次: 修改add.c 如果目标的时间比依赖的时间早, 需要更新
直接make生成的是一个条规则中的目标(终极目标)
生成其他规则中的目标:
make 其他规则中的目标的名字
第二个版本程序:
app:main.o sub.o mul.o add.o
gcc main.o sub.o mul.o add.o -o app
# 编写规则, 来生成依赖中不存在的文件
main.o:main.c
gcc -c main.c
sub.o:sub.c
gcc -c sub.c
mul.o:mul.c
gcc -c mul.c
add.o:add.c
gcc -c add.c
hello:
echo "hello makefile"
缺点: 代码冗余
第三版本:
变量: 自动变量: 自定变量只能在规则的命令中使用
$<: 依赖中的第一个
$^: 所有的依赖
[email protected]: 规则中的目标
%.o:%.c
main.o:main.c
gcc -c main.c
gcc -c main.c -o main.o
大写: makefile中自带的变量:
CC == cc == gcc
CPPFLAGS = -I./
代码:
# 自定义变量
obj = main.o sub.o mul.o add.o
app:$(obj)
gcc $(obj) -o app
# 编写规则, 来生成依赖中不存在的文件
# 模式规则
%.o:%.c
gcc -c $< -o [email protected]
缺点: .o还是需要手动指定, 适应能力不行
版本4:
使用函数: -- 在makefile里边, 所有的函数都是有返回值的
1. wildcard -- 搜索指定目录下,指定类型的文件
2. patsubst -- 匹配替换函数
代码:
# 使用makefile中的函数
src = $(wildcard ./*.c)
obj = $(patsubst %.c, %.o, $(src))
app:$(obj)
gcc $(obj) -o app
# 编写规则, 来生成依赖中不存在的文件
# 模式规则
%.o:%.c
gcc -c $< -o [email protected]
缺点: 没有清除项目的功能
版本5:
声明伪目标: 不对文件做是否更新的判断
.PHONY:目标名
# 使用makefile中的函数
target = app
src = $(wildcard ./*.c)
obj = $(patsubst %.c, %.o, $(src))
app:$(obj)
gcc $(obj) -o app
# 编写规则, 来生成依赖中不存在的文件
# 模式规则
%.o:%.c
gcc -c $< -o [email protected]
#伪目标
.PHONY:clean
clean:
-mkdir /abc
-rm -f $(obj) $(target)