Makefile
by
makefile
概念
makefile 文件是用来管理工程文件,通过执行make命令,make就会解析并执行makefile文件
makefile命名:makefile或者Makefile
规则
第一个版本
目标:依赖 (tab)命令
main: main.c fun1.c fun2.c sum.c
gcc -o main main.c fun1.c fun2.c sum.c
第二个版本
检查规则: 要想生成目标文件,先要检查依赖条件是否都存在:
- 若都存在,则比较目标时间和依赖时间,如果依赖的时间比目标时间新,则重新生成目标,否则不重新生成
- 若不存在,则往下找有没有生成依赖的规则,有则 生成
第三个版本
makefile有三种类型的变量:
- 普通变量
- 自带变量
- 自动变量
普通变量
- 变量定义直接用
=
- 使用变量值用
$
(变量名)
#下面是变量的定义和使用
foo = abc #定义变量并赋值
bar = $(foo) #使用变量,$(变量名)
自带变量
- 除了使用用户自定义变量,makefile中也提供了一些变量供用户直接使用,我们可以直接对其进行赋值:
CC = gcc #arm-linux-gcc
CPPFLAGS: C预处理的选项 -l
CFLAGS: C编译器的选项 -Wall -g -c
LDFLAGS: 链接器的选项 -L -l
自动变量
- $@:表示规则中的目标
- $<:表示规则中的第一个条件
- $^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项
模式规则
target = main
object = main.o fun1.o fun2.o sum.o
CC = gcc
CPPFLAGS = -I./
$(target):$(object)
$(CC) -o $@ $^
%.o:%.c
$(CC) -c $< $(CPPFLAGS)
makefile 函数
makefile中所有函数都具有返回值
wildcard
查找指定目录下的指定类型的文件
#查找指定目录下的指定类型文件
src = $(wildcard *.c)
patsubst
匹配替换
#把src变量里所有后缀为.c的文件替换成.o
obj = $(patsubst %.c,%.o,$(src))
makefile 的清理操作
用途:清理编译生成的中间.o文件和最终目标文件
make clean
-
如果当前目录下有同名clean文件,则不执行clean对应的命令,解决方案:
- 伪目标声明:
#声明目标为伪目标之后,makefile将不会检查该目标是否存在或者该目标是否需要更新
.PHONY:clean
-
clean命令中的特殊符号:
-xxx
此条命令出错,make也会继续执行后续命令@
不显示命令本身,只显示结果