makefile
好处 :
方便整个项目的管理
1.make
gcc - 编译器 按照某种规则去编译代码
make - linux自带的构建器
构建的规则在makefile中
2. makefile文件的命名
- makefile
- Makefile
3.makefile中的规则
gcc a.c b.c c.c -o app
- 三部分: 目标,依赖,命令
目标 app
依赖 a.c b.c c.c
命令 gcc a.c b.c c.c -o app
目标:依赖
(tab缩进) 命令
app:a.c b.c c.c
gcc a.c b.c c.c -o app
4.makefile的编写
第一个版本
缺点:
效率低,修改一个文件,所有文件会被全部重新编译
第二个版本
工作原理
依赖不存在
向下搜索子规则,如果有规则用来生成查找的依赖的,执行规则中的命令
依赖存在,判断是否需要更新
原则:目标时间>依赖的时间
反之:则更新
缺点:冗余
第三个版本
-自定义变量:
obj=a.o b.o c.o (obj 变量名,可自行定义)
obj=10
变量的取值: aa=$(obj)
-makefile 自带的变量: 大写(格式都是大写)
CPPFLAGS (指定头文件)
CC
-自动变量
$@ : 规则中的目标
$< : 规则中的第一个依赖
$^ : 规则中所有的依赖
自动变量 只能在规则的命令中使用
模式匹配:
%.o:%.c
第一次:framwork.o没有
main.o:main.c
gcc -c main.c -o main.o
第二次: add.o
add.o:add.c
gcc -c add.c -o add.o
缺点: 可移植性比较差
第四个版本
*makefile所有的函数都有返回值
*查找指定目录下指定类型的文件
src = $(wildcard ./*.c)
*匹配替换
obj = $(patsubst %.c, %.o, $(src))
缺点:不能清理项目
第五个版本
让make生成不是终极目标的目标
make 目标名
编写一个清理项目的规则
clean:
rm *.o app
-(符号) 作用:忽略执行失败的命令,让程序继续向下执行。
当前语句执行失败后, 继续向下执行
- rm $(obj) $(out) -f
声明伪目标 跳过判断环节,直接执行
.PHONY: 生成的伪目标名
.PHONY: clean
-f 强制执行
命令前加 -
忽略执行失败的命令,继续执行
.PHONY: clean
clean:
-rm -f $(obj) $(out)