静态库和动态库的区别
简而言之:静态库是.o文件,是直接编译到进程里面的,其他的进程不能使用,动态库是.so文件,是放到linux的文件系统里面的,在程序运行的时候去拿来调用,所以多个进程都能访问
# Linux中的静态库与动态库
## 静态库(Static Library)
静态库是一组预编译的目标文件(.o文件)的集合,通常以`.a`(archive)为扩展名。当程序链接静态库时,库中的代码会被完整地复制到最终的可执行文件中。
**特点:**
- 编译时链接
- 生成的可执行文件较大
- 不依赖外部库文件
- 库更新需要重新编译程序
## 动态库(Dynamic Library/Shared Library)
动态库是在程序运行时才被加载的库,通常以`.so`(shared object)为扩展名。多个程序可以共享同一个动态库的单一副本。
**特点:**
- 运行时链接
- 生成的可执行文件较小
- 依赖外部库文件
- 库更新无需重新编译程序(保持ABI兼容前提下)
## 主要区别
| 特性 | 静态库(.a) | 动态库(.so) |
|------|-----------|------------|
| 链接时机 | 编译时 | 运行时 |
| 文件大小 | 较大(包含库代码) | 较小(不包含库代码) |
| 内存占用 | 每个程序独立占用 | 多个程序可共享 |
| 更新方式 | 需重新编译 | 替换库文件即可 |
| 执行速度 | 稍快(无加载开销) | 稍慢(有加载开销) |
| 依赖关系 | 无运行时依赖 | 有运行时依赖 |
| 命名规范 | libxxx.a | libxxx.so |
## 创建与使用示例
**创建静态库:**
```bash
gcc -c file1.c file2.c # 编译为.o文件
ar rcs libmylib.a file1.o file2.o # 打包为静态库
```
**使用静态库:**
```bash
gcc main.c -L. -lmylib -o myapp
```
**创建动态库:**
```bash
gcc -fPIC -c file1.c file2.c # 编译为位置无关代码
gcc -shared -o libmylib.so file1.o file2.o # 创建动态库
```
**使用动态库:**
```bash
gcc main.c -L. -lmylib -o myapp
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH # 设置库搜索路径
```
在实际开发中,动态库更为常用,特别是对于系统级库或需要被多个程序共享的代码。而静态库则适用于需要独立分发或对性能要求极高的场景。