1. 为什么需要了解动静态库
在Linux开发环境中,库文件就像是一个个预先打包好的工具箱。想象一下,你每次写程序都要从头实现printf、malloc这些基础功能,那得多费劲?库文件就是把这些常用功能预先编译好,等着你来调用。
静态库和动态库最直观的区别就像是你工具箱的收纳方式:
- 静态库相当于把工具直接焊死在你的程序里
- 动态库则是把工具放在车间公共区域,谁用谁拿
我刚开始接触时经常搞混两者的使用场景,直到有次把整个glibc静态链接进小程序,生成的可执行文件膨胀到5MB+才恍然大悟。下面这些实际数据会让你更清楚差异:
| 特性 | 静态库(.a) | 动态库(.so) |
|---|---|---|
| 链接时机 | 编译时 | 运行时 |
| 文件独立性 | 嵌入可执行文件 | 独立存在 |
| 磁盘占用 | 较大(重复嵌入) | 较小(共享) |
| 内存占用 | 每个进程独立加载 | 多个进程共享 |
| 更新难度 | 需重新编译 | 替换文件即可 |
| 典型示例 | libc.a | libc.so.6 |
关键经验:嵌入式开发常用静态库避免依赖问题,桌面应用多用动态库节省资源。我曾在一个物联网项目里混用导致OTA更新失败,教训深刻。
2. 手把手制作静态库
2.1 准备源代码
我们先创建简单的数学函数库,这些文件将贯穿后续所有示例:
bash复制# 创建项目目录
mkdir -p ~/libdemo/src ~/libdemo/include
cd ~/libdemo/src
# 编写核心功能文件
cat > math_functions.c <<'EOF'
#include "math_functions.h"
int add(int a, int b) {
return a + b;
}
int subtract(int a, i
