0Pricing
C Academy · 课时

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) app

make 如何做出判断

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 条件编译
  2. 多文件项目
  3. Makefile
  4. 静态库与共享库
← 返回 C Academy