makefile
-linux自带的构建器,构造的规则写在makefile中
makefile文件的命名
-makefile或者Makefile
规则
-三个部分:目标、依赖、命令
书写规则如下
目标:依赖
(tab缩进)命令
(注:makefile里面有多种规则组成)
e.g:
app:a.c b.c c.c gcc a.c b.c c.c -o app
第一个版本
app:main.c add.c sub.c mul.c gcc main.c add.c sub.c mul.c -o app缺点:效率低,修改一个文件,所有的文件会被全部重新编译
第二个版本
app:main.o add.o sub.o mul.o gcc main.o add.o sub.o mul.o -o app main.o:main.c gcc main.c -c add.o:add.c gcc add.c -c sub.o:sub.c gcc sub.c -c mul.o:mul.c gcc mul.c -c
多条规则工作原理:
1、检查文件是否存在,若文件不存在,则向下搜索下面的规则,如果有规则是用来生成查找的依赖的,执行规则中的命令
2、如果依赖存在,判断是否需要更新时间。原则: 目标的时间 > 依赖的时间, 反则需要更新
缺点:相似的部分多,冗余第三个版本
需要知识点:
-自定义变量
obj= a.o b.o c.o
obj=10
变量取值: aa=$(obj)
-makefile自带的变量(大写):
CPPFLAGS
CC
-自动变量:
$@ 规则中的目标
$< 规则中的第一个依赖
$^ 规则中的所有依赖
注: 只能在规则中的命令中使用,不能再目标和依赖中使用
-模式匹配规则: %.o:%.c
第一次main.o没有,套用成
main.o:main.c
gcc -c main.c -o main.o
第二次add.o没有,套用成
add.o:add.c
gcc -c add.c -oadd.o
...
-注释用#
obj=main.o add.o sub.o mul.o target=app $(target):$(obj) gcc $^ -o $@ %.o:%.c gcc -c $< -o $@缺点:可移植性差
第四个版本
-需要知识点
makefile中所有的函数都有返回值
wildcard查找指定目录下的指定类型的文件 如: src=$(wildcard ./*.c)把当前目录下的所有的.c文件取出来
patsubst匹配替换如: obj=$(patsubst %.c,%.o,$(src)) ,把$(src)变量里面的.c文件替换成.o文件
src=$(wildcard ./*.c) obj=$(patsubst %.c,%.o,$(src)) target=app $(target):$(obj) gcc $^ -o $@ %.o:%.c gcc -c $< -o $@缺点:不能清理项目
第五个项目
-编写一个清理项目的规则
clean:
-mkdir /abc
-rm $(obj) $(target) -f
注:在命令前加-,如果当前命令执行出错,继续执行下面的命令不会终止,忽略执行出错的命令,继续执行
声明伪目标:好处,不会做更新检查,不做比对
src=$(wildcard ./*.cc) obj=$(patsubst %.cc,%.o,$(src)) target=app $(target):$(obj) gcc $^ -o $@ %.o:%.cc gcc -c $< -o $@ .PHONY:clean clean: -rm $(obj) $(target) -f