Makefile
自动化构建
Makefile 是 CoddyKit 上的免费 C Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。
为什么要使用 Makefile
手动输入 gcc 命令很快就会变得难以管理。make 会读取描述项目构建方式的 Makefile,并且只运行必要的命令。
它最重要的特性是:只有当输入文件比输出文件更新时,才会重新构建该文件,从而节省大量编译时间。
规则剖析
一条规则由三部分组成:目标、目标的前置条件以及构建配方。
构建配方所在的行必须以真正的 TAB 字符开头,不能使用空格。这是 Makefile 中最常见的错误。
target: prerequisite1 prerequisite2
<TAB>command to build target第一个 Makefile
这个 Makefile 会从两个源文件构建 app。不带参数运行 make 时,会构建第一条目标。
如果自上次构建以来两个源文件都没有变化,make 会输出“已是最新”,然后不执行任何操作。
app: main.c math_utils.c
gcc main.c math_utils.c -o app分离编译规则
分别构建每个目标文件意味着:某个文件发生变化时,只需重新编译该文件。
make 会遵循依赖关系图:修改 main.c 后,只会重新运行 main.o 的构建以及最后的链接步骤。
app: main.o math_utils.o
gcc main.o math_utils.o -o app
main.o: main.c math_utils.h
gcc -c main.c
math_utils.o: math_utils.c math_utils.h
gcc -c math_utils.c变量
变量可以消除重复内容。在顶部定义变量,然后使用 $(NAME) 展开它们。
这样,修改编译器或编译选项时只需改动一个地方。
CC = gcc
CFLAGS = -Wall -Wextra -g
app: main.o math_utils.o
$(CC) main.o math_utils.o -o app自动变量
make 在构建配方中提供了以下简写:
$@—— 目标名称$^—— 所有前置条件$<—— 第一个前置条件
它们可以让构建配方保持简短且正确。
app: main.o math_utils.o
$(CC) $^ -o $@
main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@模式规则
一条模式规则就可以将每个 .c 文件编译为对应的 .o 文件,因此您不必为每个文件分别编写规则。
% 可以匹配任意主干;与 $< 和 $@ 结合使用时,它就是完全通用的。
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@伪目标
像 clean 这样的目标不会生成同名文件。请将它们声明为 .PHONY,这样即使存在名为“clean”的文件,make 也总会运行它们。
clean 会删除构建产物,从而强制进行全新构建。
.PHONY: clean
clean:
rm -f *.o app完整的 Makefile
把所有内容组合起来:变量、模式规则、链接规则以及伪目标 clean。
这种写法可以扩展到许多文件,而无需针对每个文件进行修改。
CC = gcc
CFLAGS = -Wall -Wextra -g
OBJS = main.o math_utils.o
app: $(OBJS)
$(CC) $^ -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(OBJS) appmake 如何做出判断
make 会比较时间戳。如果任一前置条件的修改时间更新,或者目标不存在,就会重新构建目标。
这就是列出头文件依赖关系很重要的原因:编辑头文件后,所有依赖它的目标文件都会被正确地重新构建。
多个目标与默认目标
Makefile 中的第一条目标就是默认目标,在您直接输入 make 时运行。按照惯例,它通常命名为 all。
您也可以按名称构建特定目标,例如 make clean 或 make test,这样一个 Makefile 就能提供多个实用的入口。
.PHONY: all
all: app
test: app
./app --selftest快速检查
诊断一个经典的 Makefile 错误。
回顾
现在您已经可以使用 make 自动化构建了:
- 规则由目标、前置条件和以 TAB 缩进的构建配方组成
- 变量和自动变量(
$@ $^ $<)可以减少重复内容 - 模式规则(
%.o: %.c)可以通用地处理所有文件 .PHONY用于标记clean这类非文件目标- make 根据时间戳,只重新构建已过期的内容
下一步:构建静态库和动态库。
常见问题解答
「Makefile」课时是免费的吗?
是的 — 「Makefile」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。
「Makefile」这节课中我会学到什么?
自动化构建 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Makefile」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C Academy 课中编写并运行代码吗?
能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。