一、make
gcc
编译器make
是 Linux 自带的构建器
二、文件命名
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
-
makefile 中可以有多条规则
四、makefile 优化
-
版本一:
app:main.c add.c sub.c gcc main.c add.c sub.c -I ./ -o app
存在的问题: 效率低,其中一个文件修改了,剩余的其它文件都要重新编译
-
版本二:
app:main.o add.o sub.o gcc main.o add.o sub.o -I ./ -o app main.o:main.c gcc main.c -c -I ./ add.o:add.c gcc add.c -c -I ./ sub.o:sub.c gcc sub.c -c -I ./
存在的问题: 冗余
-
版本三:
- 自定义变量:
obj=a.o b.o c.o
- 自定义变量取值:
tmp=$(obj)
- makefile 自带的变量,一般都是大写的
- 自动变量:只能在规则的命令中使用
$@
:规则中的目标$<
:规则中的第一个依赖$^
:规则中的所有依赖
obj = main.o add.o sub.o target = app $(target):$(obj) gcc $(obj) -o $(target) -I ./ %.o:%.c gcc -c $< -o $@ -I ./
obj = main.o add.o sub.o target = app $(target):$(obj) gcc $^ -o $@ -I ./ %.o:%.c gcc -c $< -o $@ -I ./
存在的问题: 可移植性比较差
- 自定义变量:
-
版本四:(makefile 中的函数)
wildcard
:查找指定目录下指定类型的文件patsubst
:匹配替换
src = $(wildcard ./*.c) obj = $(patsubst %.c,%.o,$(src)) target = app $(target):$(obj) gcc $^ -o $@ -I ./ %.o:%.c gcc $< -c -I ./
存在的问题: 不能自动清除
-
版本五:
make 目标名
:让 make 执行非终极目标clean:
:编写一个清理项目的规则(只有目标,没有依赖项)-f
:强制执行.PHONY:clean
:声明伪目标,避免同名文件干扰-命令
:忽略执行失败的命令,继续向下执行
src = $(wildcard ./*.c) obj = $(patsubst %.c,%.o,$(src)) target = app $(target):$(obj) gcc $^ -o $@ -I ./ %.o:%.c gcc $< -c -I ./ .PHONY:clean clean: -mkdir /abc -rm *.o $(target) -f