0Pricing
C Academy · 课时

编译多个文件

构建多文件程序。

编译多个文件 是 CoddyKit 上的免费 C Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。

从源代码到程序

将多个文件组成的 C 源代码转换为可执行文件,需要经过两个阶段:编译和链接。

每个 .c 文件都会单独编译成一个目标文件。然后,链接器会合并所有目标文件,解析它们之间的引用,生成一个可运行的程序。

一条命令完成构建

最简单的方法是一次性将所有源文件交给 gcc。编译器会分别构建每个文件,然后自动完成链接。

-o 标志用于指定输出程序的名称。请列出所有 .c 文件;头文件会通过 #include 引入,不需要在这里列出。

gcc main.c math_utils.c -o app

分别编译

对于较大的项目,可以使用 -c 将每个文件编译成目标文件。这样会生成一个 .o 文件,但不会执行链接。

分别编译意味着修改一个源文件时只需重新编译该文件,从而加快大型项目的构建速度。

gcc -c main.c        /* produces main.o */
gcc -c math_utils.c  /* produces math_utils.o */

链接步骤

获得目标文件后,将它们链接成一个可执行文件。在这里,gcc 充当链接器,合并这些目标文件并解析跨文件符号。

这次不使用 -c,因为我们需要的是最终程序,而不是另一个目标文件。

gcc main.o math_utils.o -o app

链接器的工作

链接器会将符号的每次使用与它的定义相匹配。

当 main.o 调用 add 时,链接器会在 math_utils.o 中找到定义的 add,并将它们连接起来。它还会引入程序所需的标准库代码。

未定义引用错误

如果您在链接时忘记了某个目标文件,链接器就找不到相应的定义,并报告未定义引用。

这是链接时错误,而不是编译错误:每个文件都能顺利编译,但最终命令缺少所需的定义。

gcc main.o -o app
/* undefined reference to `add' */
/* fix: include math_utils.o */

实用的警告标志

请始终启用警告进行编译。-Wall 和 -Wextra 可以尽早发现可能存在的错误。

添加 -std=c11 可以选择一种语言标准,使程序在不同编译器上的行为更加可预测。无论一次性编译还是分别编译,这些标志都适用。

gcc -Wall -Wextra -std=c11 -c main.c
gcc -Wall -Wextra -std=c11 -c math_utils.c
gcc main.o math_utils.o -o app

包含路径

当头文件位于其他目录时,请使用 -I 告诉编译器应在哪里查找。

例如,-Iinclude 会将 include/ 文件夹加入搜索路径,因此即使从其他文件夹执行,#include "math_utils.h" 也能找到对应文件。

gcc -Iinclude -c src/main.c -o build/main.o

重新编译为何重要

当只有一个文件发生变化时,分别编译的优势就很明显。您只需重新编译该文件对应的目标文件,然后重新链接。

不过,如果您编辑了一个头文件,所有包含它的源文件都必须重新编译,因为头文件的文本是每个源文件的一部分。

/* edited math_utils.c only */
gcc -c math_utils.c
gcc main.o math_utils.o -o app

使用构建工具自动化

手动输入命令很快就会变得繁琐。Makefile 会记录规则,并且只重新构建发生变化的部分。

这个最小示例会将两个目标文件链接成 app;make 会跟踪文件的时间戳,以决定需要重新编译哪些内容。

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

完整构建回顾

下面展示一个小型项目从目标文件到最终程序的完整流程,并且启用了警告。

先编译每个源文件,再链接这些目标文件。运行生成的程序,确认整个流程正常工作。

gcc -Wall -c main.c
gcc -Wall -c math_utils.c
gcc main.o math_utils.o -o app
./app

快速检查

检查您对多文件构建过程的理解。

回顾

您已经学会使用 -c 将每个 .c 文件编译成目标文件,然后将这些目标文件链接成程序。使用 -Wall 和 -I 分别启用警告和指定包含路径。

未定义引用意味着链接时缺少某个目标文件。使用 make 等工具,可以自动完成仅针对变更内容的重新构建。

常见问题解答

「编译多个文件」课时是免费的吗?

是的 — 「编译多个文件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。

「编译多个文件」这节课中我会学到什么?

构建多文件程序。 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「编译多个文件」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C Academy 课中编写并运行代码吗?

能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 头文件与源文件
  2. 包含保护
  3. extern 与链接
  4. 编译多个文件
← 返回 C Academy