阶段 1.2: Make 进阶(模式规则 + 自动变量 + 多文件)
学习目标
- 掌握伪目标(
.PHONY):解决与文件重名的问题(如clean文件存在时,make clean不执行) - 学会模式规则(
%匹配符):批量处理文件(如.c→.o) - 掌握自动变量:简化命令(
$@目标、$^所有依赖、$<第一个依赖) - 处理多文件、多目录的构建
核心知识点
- 伪目标:
/.PHONY: clean(声明 clean 是伪目标,不是文件) - 模式规则:
%.o: %.c(所有.o文件依赖对应的.c文件) - 自动变量:$@:当前目标文件(如main.o)$^:所有依赖文件(如main.c add.c)$<:第一个依赖文件(如main.c)
- 函数:
wildcard(查找文件,如$(wildcard *.c))、patsubst(字符串替换,如$(patsubst %.c, %.o, $(SRCS)))
实战练习
练习 3:多文件程序的 Makefile(模式规则 + 自动变量)
步骤 1:编写源文件
main.c:c运行add.c:c运行sub.c:c运行calc.h:c运行
步骤 2:编写Makefile
CC = gcc
CFLAGS = -Wall
TARGET = calc
# 查找所有.c文件
SRCS = $(wildcard *.c)
# 将.c替换为.o
OBJS = $(patsubst %.c, %.o, $(SRCS))
# 目标:依赖所有.o文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@ # $^是所有.o,$@是calc
# 模式规则:.o依赖.c
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@ # $<是对应的.c文件
# 伪目标
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJS)
步骤 3:执行
make # 生成calc和.o文件 ./calc # 输出1+2=3,5-3=2 make clean # 清理所有生成文件
练习 4:条件编译(DEBUG 模式)
要求:添加条件判断,传入DEBUG=1时,启用调试模式(-g -O0),否则启用优化模式(-O2)。
CC = gcc
CFLAGS = -Wall
TARGET = calc
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))
# 条件判断:如果DEBUG=1,添加调试选项
ifeq ($(DEBUG), 1)
CFLAGS += -g -O0
else
CFLAGS += -O2
endif
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJS)
执行:
make # 优化模式 make DEBUG=1 # 调试模式(可通过gdb调试)
构建工具学习 文章被收录于专栏
make cmake