编译多个文件
构建多文件程序。
编译多个文件 是 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 反馈 — 无需本地设置。
此课程中的所有课时
- 头文件与源文件
- 包含保护
- extern 与链接
- 编译多个文件