makefile
Makefile 的结构:
target : prerequisites
recipe(命令行,必须以 TAB 开头)
target:目标(最终生成的文件,比如可执行文件或 .o 文件)
prerequisites:依赖(生成该目标所需的源文件或目标文件)
recipe:规则(编译或操作命令,必须以一个 Tab 键 开头)

最终目标:edit(可执行文件)
edit : main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
-
含义:
目标是 edit(可执行程序)
依赖于 8 个 .o 文件(目标文件)
第二行是 gcc 链接命令,把所有 .o 文件链接生成最终的 edit 可执行文件 -
后面几行编译每一个 .c 文件为 .o 文件
-
最后clean 规则(非文件目标)
clean :
rm edit main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
clean 是一个伪目标(不是生成的文件)
作用是删除所有中间文件和最终的 edit,保持工程整洁
可用命令:make clean -
还可以使用赋值符:
- 赋值最后一个有效值 =(延时赋值)
- 赋值前最后一个有效值 :=(及时赋值)
- 未赋值过则赋值 ?=
- 变量追加 +=
- 使用通配符来简化过程 %
使用赋值和通配符之后
![]()
- 自动化变量

- 伪目标
![]()
还有多目标、函数等
二、Makefile 中常用函数介绍
Makefile 内置函数使用方式如下:
$(函数名 参数)
例如:
FILES := $(wildcard *.c)
- foreach:对一组值循环处理
$(foreach var, list, text)
含义:对 list 中每个元素赋值给 var,然后执行 text
示例:
SRC := main.c util.c test.c
OBJ := $(foreach file, $(SRC), $(file:.c=.o))
结果:OBJ 等于 main.o util.o test.o
-
wildcard:获取匹配文件列表(通配符)
$(wildcard pattern)
示例:
SRC := $(wildcard src/*.c)
意思:获取 src 目录下所有 .c 文件
-
patsubst:模式替换
$(patsubst pattern, replacement, text)
作用:在 text 中,把符合 pattern 的部分替换成 replacement
示例:
SRC := a.c b.c c.c
OBJ := $(patsubst %.c, %.o, $(SRC))
结果:OBJ 是 a.o b.o c.o
-
filter / filter-out(补充):
$(filter pattern..., text) # 保留匹配 pattern 的
$(filter-out pattern..., text) # 排除匹配 pattern 的
示例:
SRC := main.c test.c debug.c
REAL := $(filter-out test.c debug.c, $(SRC))
结果:REAL 只有 main.c

可参考https://github.com/seisman/how-to-write-makefile


浙公网安备 33010602011771号