阶段 1.2: Make 进阶(模式规则 + 自动变量 + 多文件)

学习目标

  1. 掌握伪目标.PHONY):解决与文件重名的问题(如clean文件存在时,make clean不执行)
  2. 学会模式规则%匹配符):批量处理文件(如.c.o
  3. 掌握自动变量:简化命令($@目标、$^所有依赖、$<第一个依赖)
  4. 处理多文件、多目录的构建

核心知识点

  1. 伪目标/.PHONY: clean(声明 clean 是伪目标,不是文件)
  2. 模式规则%.o: %.c(所有.o文件依赖对应的.c文件)
  3. 自动变量:$@:当前目标文件(如main.o)$^:所有依赖文件(如main.c add.c)$<:第一个依赖文件(如main.c)
  4. 函数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

全部评论
你这写的已经是很基础的了
点赞 回复 分享
发布于 昨天 21:37 陕西

相关推荐

Lorn的意义:我的前辈都劝我年后再投,说那时候会好一点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务