1、Makefile
- 是一个工程管理文件,能够完成程序的自动化编译
- 需要使用make工具,对Makefile文件进行读取
- Makefile可以了解程序的执行和编译过程,提高工作效率
1.1 工作过程
- 把代码的运行分为两步
- 生成二进制文件,节约编译时间
- 链接生成可执行文件,保证中间文件,已经执行完编译中大部分操作
- Makefile会根据文件的时间戳判断文件是否更新
- make工具会默认读入名为makefile的工程文件,如果makefile和Makefile优先读入makefile
- 指定make读入文件
make -f 文件名
1.2 语法
-
Makefile由规则、变量、函数和条件编译构成
-
一条规则的构成: 目标:依赖 指令
-
规则必须有一个目标
-
一条规则可以没有依赖,只执行某些指令
-
一条规则可以不执行指令,只说明依赖关系
-
一个目标可以有多个依赖
all:fun
#all:fun
fun:main.o fun.o
gcc main.o fun.o -o fun
main.o:main.c fun.h
gcc -c main.c -o main.o
fun.o:fun.c fun.h
gcc -c fun.c -o fun.o
clean:
rm *.o fun
1.3 make工具的使用
make 参数 目标
- 如果不加目标,make默认去执行文件中的第一个目标
- all可以指定一个目标优先执行,所以all一般依赖于可执行文件
1.4 变量引入
-
Makefile中的变量赋值方式
=:递归赋值
取最后一次的值+=:追加赋值
在原值后面+空格+数值:=:立即赋值
在哪里赋值,就在哪里替换?=:条件赋值
判断变量前面是否定义,没定义就赋值,定义过就跳过
#OBJs是记录.o文件的变量
OBJs+=fun.o
OBJs+=main.o
#EXE是记录可执行文件的变量
EXE=fun
#CC是Makefile提供的自动变量,自动匹配程序所需的编译器
CC=gcc
#CFLAGS是记录编译参数的变量,也是Makefile提供的自动变量
CFLAGS=-c -o
all:$(EXE)
$(EXE):$(OBJs)
$(CC) $(OBJs) -o $(EXE)
main.o:main.c
$(CC) $(CFLAGS) main.o main.c
fun.o:fun.c
$(CC) $(CFLAGS) fun.o fun.c
clean:
rm *.o $(EXE)
1.5 引入自动变量和通配符
-
自动变量
- $@:所有目标
- $^:所有依赖
- $#:第一个依赖
-
通配符
- *****:通配所有文件
- %:模式匹配
- 应用
%.o:%.c
- 先拿到
fun.o
- 进行模式匹配,
%.o和fun.o匹配
,得到**%**是fun - 继续匹配,匹配到**.c的部分,%.c**就等于fun.c
- 应用
#OBJs是记录.o文件的变量
OBJs+=fun.o
OBJs+=main.o
#EXE是记录可执行文件的变量
EXE=fun
#CC是Makefile提供的自动变量,自动匹配程序所需的编译器
CC=gcc
#CFLAGS是记录编译参数的变量,也是Makefile提供的自动变量
CFLAGS=-c -o
all:$(EXE)
$(EXE):$(OBJs)
$(CC) $(OBJs) -o $(EXE)
%.o:%.c
$(CC) $(CFLAGS) $@ $^
clean:
rm *.o $(EXE)
1.6 引入函数
- 内置函数
- 要求:Makefile中需要的文件必须在同一路径下,并且该路径下不允许有其他文件
- wildcard
- 使用wildcard获取,文件中的所有**.c**文件
$(wildcard 指定的文件格式)
获取当前目录下,所有指定格式的文件
- patsubst
- 模式匹配
$(patsubst 模式1,模式2,要转换的字符串)
$(patasubst %c,%o,$(wildcard))
#OBJs是记录.o文件的变量
files=$(wildcard *.c)
OBJs=$(patsubst %c,%o,$(files))
#EXE是记录可执行文件的变量
EXE=fun
#CC是Makefile提供的自动变量,自动匹配程序所需的编译器
CC=gcc
#CFLAGS是记录编译参数的变量,也是Makefile提供的自动变量
CFLAGS=-c -o
all:$(EXE)
$(EXE):$(OBJs)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) $@ $^
clean:
rm *.o $(EXE)