静态库与共享库
构建并链接库
静态库与共享库 是 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 反馈 — 无需本地设置。