阶段 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

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

相关推荐

点赞 评论 收藏
分享
昨天 15:15
门头沟学院 Java
1.实习介绍2.你项目里用到线程池了对吧?那你说说几个核心参数怎么配的?你是怎么确定核心线程数和队列大小的3.你提到了用线程池处理异步任务,那你们有没有遇到过线程池满了的情况?那这种情况下会发生什么?4.除了你刚才说的用线程池,还有用到哪些并发工具?说说你对lock和synchronized区别的理解5.了解]ava的垃圾回收机制吗?有没有分析过自己项目里的&nbsp;FulLGC?你是怎么看GC日志定位问题的6.MinorGC频繁你们会怎么看?在你们项目里有没有遇到过YGC抖动但没有触发FGC的情况7.你说你们发券接口慢查询了,那你不是说已经命中索引了吗?那为啥还是慢?你是怎么一步步分析出来问题点的8.讲讲你对覆盖索引的理解9.你用Redis的setnx+expire&nbsp;实现分布式锁,如果锁被提前删了,另一个线程进来了,造成数据错误怎么办?10.你说你用策略模式做钱包接入,那我现在让你临时加一个xx钱包它的汇率换算规则完全不同,还有一个中间加密逻辑不兼容。你这个策略体系能不能动态扩展11.现在要求你设计一个券模板系统,支持10个钱包,不同语言、不同活动样式、不同过期时间规则,你怎么来设计12.公司要上线一套面向全球商户的&nbsp;多钱包&nbsp;NFC&nbsp;预授权支付系统,比如用户在海外便利店碰一碰刷手机,完成预授权+多币种冻结+结算清算操作。需要支持:多钱包,多币种,多语言/多时区,境内境外结算链路不同,用户支付前是预授权冻结额度,非立即扣款,后台交易&nbsp;T+1&nbsp;进行清算入账,用户可以中途取消、修改订单,你怎么来设计13.T+1&nbsp;清算你会怎么落地?是否要分批结算14.用户发起支付后,触发钱包冻结请求超时,你怎么保障一致性?15.用户下单后隔天取消订单,涉及的冻结金额要解冻、汇率要重算这个流程你怎么设计16.每天凌晨结算任务量激增,结算服务压垮,部分记录没算成功,你怎么来兜底呢17.手撕:实现一个函数,给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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