makefile写法 规则
三要素:
- 目标
- 依赖
- 命令
语法:例子:
目标:依赖条件
命令
app:main.c add.c sub.c mul.c
gcc main.c add.c sub.c mul.c -o app
改进:
- 【makefile写法】只是编译修改的部分,是把编译和链接分开执行
app:main.o add.o sub.o mul.o gcc main.o add.o sub.o mul.o -o appmain.o:main.c gcc -c main.c add.o:add.c gcc -c add.c mul.o:mul.c gcc -c mul.c sub.o:sub.c gcc -c sub.c
- 默认只生成第一条规则
- 所以需要把最终的生成目标写在第一条
- 更新源文件时,会比较目标和依赖的时间关系,如果依赖比目标还晚,就会重新执行命令,
- 其中一个更新,会导致其他依赖此目标的规则进行执行,最终导致最终的目标被更新
- $< : 规则中第一个依赖
- $@ : 规则中的目标
- $^ : 规则中所有的依赖
- 以上三个只能在命令中写
- % : 模式规则,会做替换,比如用main,add来替换
- CC : 系统维护的变量 CC = cc = gcc
- CPPFLAGS : 预编译(头文件展开,宏替换,去掉注释)的选项
- CFLAG : 编译时的选项 -L -g
- 全大写是内部维护变量
app:main.o add.o sub.o mul.o
gcc main.o add.o sub.o mul.o -o app
等价于 gcc $^ -o $@
obj=main.o add.o sub.o mul.o
target=app
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)%.o:%.c
$(CC) -c $< -o $@
函数:
- 一定有返回值
obj=main.o add.o sub.o mul.o
target=app
#获取所有.c文件的函数wildcard,用$获取返回值
src=https://www.it610.com/article/$(wildcard ./*.c)
#把所有的.c替换成.o
obj=$(patsubst ./%.c, ./%.o, $(src))
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)%.o:%.c
$(CC) -c $< -o $@
obj=main.o add.o sub.o mul.o
target=app
#获取所有.c文件的函数wildcard,用$获取返回值
src=https://www.it610.com/article/$(wildcard ./*.c)
#把所有的.c替换成.o
obj=$(patsubst ./%.c, ./%.o, $(src))
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)%.o:%.c
$(CC) -c $< -o $@#伪目标,不会进行更新时间的比较,防止在文件夹下有clean文件,导致clean无法执行
.PHONYLclaen
clean:
#命令前面加上-意思是命令执行错误也继续执行
-mkdir /aa
rm $(obj) $(target)