1命名
makefile或者Makefile 可以被系统识别
2规则
规则的3要素
1)目标,依赖,命令
目标 :依赖
[TAB] 编译命令
只执行第一行目标,需要的依赖在后续规则中先执行。
app:a.o b.o
gcc a.o b.o -o app //根据目标文件来编译可执行文件,就不需每次重新编译c文件
a.o:a.c
gcc -c a.c
b.o :b.c
gcc -c b.c
2)makefile中的变量
CC = gcc
CFLAGS = -I
obj = a.o b.o
target=app // 自定义变量 #表注释符
$(target):$(obj) //使用变量代替,变量没有类型的
gcc $(obj) -o $(target)
%.o:%.c //%表示通配符
$(CC) -c $< -o $@ //自动变量 $<规则中的第一个依赖 $@规则中的目标 $^规则中所有依赖
一些makefile维护的系统的变量 一般是大写
CC = gcc
CFLAGS:预处理器需要的选项 如 -I (头文件目录)`
LDFLAGS :编译时使用的的参数 如 -Wall(警告信息)-g(调试信息)-c (生成.o文件)
3)makefile中的函数
makefile中的所有函数都有返回值
src = $(wildcard ./*.c) //wildcard 获取指定目录下文件,参数在函数名后面,返回值 $引用赋值给src
obj = $(patsubst ./%.o, ./%.c, $(src)) //patsubst 从src中取出*.c 替换成*.o,返回值 再$ 赋值给obj
4)声明伪目标
.PHONY:clean //声明伪目标后,make就不会比较目标的更新时间,仍要执行下面的命令
5)命令前加 - ,命令执行失败就忽略,继续向下执行,否则会停止makefile
clean:
-mkdir /aa //在根目录下创建aa文件夹,普通用户权限不够,make clean时会失败,加- 后会忽略跳过。
-rm *.o app //(rm -f 强制执行)