Makefile 自动化编译六连工程:从基础规则到自动依赖、静态库与动态库全实测
Makefile 教程常见的两个痛点:例子太琐碎拼不成体系,或者直接上大型项目看不懂。这套教学工程用 6 个目录走一条平滑曲线——从「最基础的三段式规则」递进到「自动依赖、静态库、动态库」,每个工程都带真实编译输出,全部在 Windows 11 x64 + GNU Make 4.4.1 + GCC 16.2.0(w64devkit 工具链)实测通过。
一、六个工程一条曲线
| 目录 | 教学点 | 实测结果 |
|---|---|---|
| 01-basic | 目标/依赖/命令三段式 | add(2,3)=5 factorial(6)=720 |
| 02-variables | := ?= 与自动化变量 $@ $< $^ | -Wall -Wextra 零告警 |
| 03-wildcard | wildcard/patsubst 收集源文件 | 新增 .c 免改 Makefile |
| 04-depfiles | 静态模式规则 + -MMD -MP | 改头文件只重编 2 个 .o |
| 05-static-lib | ar rcs 打包 + -L -l 链接 | libmymath.a 生成链接成功 |
| 06-dll | -shared 出 dll + 导入库 | dll 39,439B / exe 87,881B |
按目录编号顺序读每个 Makefile 的注释,每条新语法都建立在前一个例子的基础上,一遍下来规则、变量、依赖、库链接全部打通。
二、自动依赖三件套(最容易被忽略的实战点)
手写依赖会漏——改了头文件忘写依赖,改动不生效;全量重编又浪费。标准解法三行:
%.o: %.c $(CC) -Wall -MMD -MP -c $< -o $@ -include $(DEPS)编译时顺手生成.d依赖描述文件,Make 下次运行自动知道「main.o 依赖 math_utils.h」。实测 touch 一个头文件,只有包含它的两个 .o 被重编,string_utils.o 纹丝不动——大型项目里这是分钟级与小时级的差距。
三、高频踩坑速查
| 现象 | 原因与解决 |
|---|---|
| missing separator | 命令行必须 TAB 缩进,空格不行 |
| 改了 .h 没 反应 | 没生成自动依赖,用 -MMD -MP -include |
| dll 程序闪退 | 运行目录要有 dll,或把 dll 目录加入 Path |
| clean 在 Windows 报错 | 命令前加 - 忽略失败,或用 $(RM) |
四、使用方法
装好带 gcc 与 make 的工具链(Windows 推荐 w64devkit 解压即用),进任意目录make、跑./app.exe看输出、make clean清理。六个工程看懂后,把自己的项目源码套进 04-depfiles 的模板,就是一个够用多年的通用 Makefile。
📦 本文对应的 6 个递进工程源码已整理上传:点击查看资源包