gcc-编译器
make-linux自带的构建器 , 构建的规则在makefile中
命名 makefile Makefile
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
makefile中由一条或多条规则组成
例
#缺点:修改一个文件,所有文件都会被全部重新编译
app:main.c add.c sub.c mul.c
gcc main.c add.c sub.c mul.c -a app
makefile工作原理:
检测依赖是否存在,
不存在,则向下搜索下边的规则,有
规则是用来生成查找的依赖,执行规则中的命令
如果依赖存在,判断是否需要更新,判断原则:目标时间大于依赖的时间,反之则更新
(因为目标是后面生成的,文件的时间肯定比依赖的时间晚)
自定义变量: obj=a.o b.o c.o
obj=10
变量的取值: aa=$(obj)
makefile自带的变量(大写):
CPPFLAGS
CC
自动变量(只能在规则的命令使用):
$@ 表示规则中的目标
$< 规则中的第一个依赖
$^ 规则中所有的依赖
例子:
obj= main.o add.o sub.o mul.o
app:$(obj)
gcc $^ -o $@
# gcc (obj) -o app
# 模式匹配 %.o:%.c (%相当于一个匹配符)
# $@代表规则中的目标%.o
#下面是一个规则
%.o:%.c
gcc -c $< -o $@
------------------------------------------------
makefile 所有的函数都有返回值
函数
1 查找指定目录下指定类型的文件的函数 wildcard
src=$(wildcard 指定目录 文件类型) src是自己定义的一个变量
例 src=$(wildcard ./*.c) 搜索当前目录下.c的文件
2 匹配替换函数 patsubst
obj=$(patsubst 替换什么类型的文件,替换成什么格式的文件, 要替换的文件的来源)
例 obj=$(patsubst %.c,%.o,$(src)) 注意要用%
例子
src=$(wildcard ./*.c)
obj=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(obj)
gcc $^ -o $@
# gcc (obj) -o app
%.o:%.c
gcc -c $< -o $@
------------------------------------------------
编写一个清理项目的规则,可以不写依赖
cleanpro:
rm *.o app
或
clean:
rm $(obj) $(target) -f
# -f 强制删除,不会有提示
让make生成不是终极目标的目标:make 目标名
在终端 make cleanpro
make+目标的名字 生成指定的目标
规则的命令加减号-:表示忽略当前的命令执行失败了,继续向下执行
例
clean:
-mkdir /abc
-rm $(obj) $(target) -f
不做目标和依赖更新检查()
声明伪目标:
.PHONY: 要声明的目标
例
# 要写在前面
.PHONY: clean
clean:
-mkdir /abc
-rm $(obj) $(target) -f