Makefile教程
1. Makefile 基础
核心作用
- 自动化编译:根据文件依赖关系,仅重新编译修改过的文件,提升效率。
- 管理复杂任务:定义任务(如编译、测试、清理),通过一条命令执行。
2. 基本语法
规则结构
target: prerequisites
recipe
- target:生成的目标(如可执行文件、任务名)。
- prerequisites:依赖的文件或目标。
- recipe:执行的命令(必须用 Tab 缩进)。
示例:编译 C 程序
# 定义编译器和编译选项
CC = gcc
CFLAGS = -Wall -g
# 定义目标
app: main.o utils.o
$(CC) $(CFLAGS) -o app main.o utils.o
# 生成 .o 文件的规则
main.o: main.c utils.h
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c utils.h
$(CC) $(CFLAGS) -c utils.c
# 清理生成的文件
clean:
rm -f app *.o
3. 核心功能
变量
- 自定义变量:
CC = gcc CFLAGS = -Wall
- 自动变量(常用):
$@
:当前目标名(如app
)。$<
:第一个依赖文件(如main.c
)。$^
:所有依赖文件(如main.c utils.c
)。
隐式规则
- Make 自动推导如何从
.c
生成.o
,简化写法:app: main.o utils.o $(CC) $(CFLAGS) -o $@ $^
伪目标
- 定义不生成文件的任务(如
clean
):.PHONY: clean clean: rm -f app *.o
4. 高级技巧
条件判断
DEBUG = 1
ifeq ($(DEBUG), 1)
CFLAGS += -DDEBUG
endif
函数调用
-
wildcard:获取文件列表
SRC = $(wildcard *.c) OBJ = $(SRC:.c=.o)
-
patsubst:模式替换
OBJ = $(patsubst %.c,%.o,$(SRC))
多目录管理
SRC_DIR = src
BUILD_DIR = build
# 将 src/*.c 编译到 build/*.o
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
5. 常用命令
- 编译:
make
(默认执行第一个目标) - 指定目标:
make clean
- 并行编译:
make -j4
(使用 4 个线程) - 显示命令但不执行:
make -n
6. 完整示例
# 定义变量
CC = gcc
CFLAGS = -Wall -O2
TARGET = myapp
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)
# 默认目标
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $@ $^
# 生成 .o 文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 清理
.PHONY: clean
clean:
rm -f $(TARGET) *.o
7. 学习资源
- 官方手册:GNU Make Manual (链接)
- 书籍推荐:《Managing Projects with GNU Make》