0Pricing
C Academy · 课时

静态库与共享库

构建并链接库

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

库是什么

库是一组经过编译的目标文件,您可以在多个程序之间重复使用,而不必每次都重新编译源代码。

C 语言中的库有两种:

  • 静态库(.a)在链接时复制到可执行文件中
  • 动态库(.so)在运行时加载

构建目标文件

两种库都从目标文件开始。像往常一样,使用 -c 编译源文件。

这些 .o 文件就是归档器或链接器要打包的原材料。

gcc -c mathlib.c -o mathlib.o
gcc -c strlib.c -o strlib.o

创建静态库

ar 归档器会将目标文件打包到一个 .a 归档文件中。约定的名称格式是 lib<name>.a。

这些选项的含义是:r 插入,c 在需要时创建,s 写入索引。

ar rcs libmymath.a mathlib.o strlib.o

链接静态库

使用 -L 指定搜索目录,使用 -l 指定库名称(去掉 lib 前缀和 .a 后缀)。

所需代码会被复制到可执行文件中,之后该文件就可以独立运行。

gcc main.c -L. -lmymath -o app

静态链接的权衡

静态链接简单且自包含:

  • 可执行文件包含所有内容,不依赖运行时库
  • 但每个程序都保存一份副本,会使二进制文件更大
  • 修复库中的错误后,必须重新链接所有使用该库的程序

与位置无关的代码

动态库可以加载到任意内存地址,因此其中的代码必须与位置无关。请使用 -fPIC 进行编译。

这样生成的代码使用相对寻址,而不是固定地址。

gcc -fPIC -c mathlib.c -o mathlib.o
gcc -fPIC -c strlib.c -o strlib.o

创建动态库

使用 -shared 构建 .so 文件。约定的名称格式是 lib<name>.so。

与静态归档文件不同,这是一个真正链接后的对象,加载器可以在运行时将它映射到内存中。

gcc -shared mathlib.o strlib.o -o libmymath.so

链接动态库

链接方式与静态库完全相同。区别在于,代码不会被复制进去,而只会记录一个引用。

可执行文件保持较小,但现在依赖于运行时能够找到 libmymath.so。

gcc main.c -L. -lmymath -o app

在运行时查找库

启动时,动态加载器会在标准路径中搜索 .so 文件。当前目录中的库不在该列表中。

在测试时,可以使用 LD_LIBRARY_PATH(Linux)将加载器指向该库。

LD_LIBRARY_PATH=. ./app

动态库的权衡

动态库以简单性换取灵活性:

  • 内存中只有一份副本,可由多个程序共享,从而节省 RAM 和磁盘空间
  • 修复 .so 中的错误后,所有程序都能受益,而无需重新链接
  • 但如果 .so 缺失或不兼容,程序就无法启动

最后一种风险就是经典的“依赖地狱”。

检查依赖关系

以下两个工具可以帮助您查看二进制文件链接了哪些内容:

  • ldd app 会列出加载器在运行时需要的动态库
  • nm libmymath.a 会列出库中的符号(函数)

如果 ldd 显示“not found”,说明加载器无法在其搜索路径中找到该 .so 文件。

ldd app
nm libmymath.a

快速检查

将选项与目标匹配起来。

回顾

现在您已经可以构建并链接这两种库了:

  • 静态库:ar rcs libX.a *.o,代码会被复制到二进制文件中,自包含但体积更大
  • 动态库:使用 -fPIC 编译,使用 -shared 构建,代码在运行时加载
  • 两者都使用 -L 和 -l 进行链接;动态库需要诸如 LD_LIBRARY_PATH 这样的运行时搜索路径

现在您已经掌握了从预处理器到构建的完整工具链。

常见问题解答

「静态库与共享库」课时是免费的吗?

是的 — 「静态库与共享库」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 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. Makefile
  4. 静态库与共享库
← 返回 C Academy