当前位置: 首页 > news >正文

静态库和动态库的区别

简而言之:静态库是.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  # 设置库搜索路径
```

在实际开发中,动态库更为常用,特别是对于系统级库或需要被多个程序共享的代码。而静态库则适用于需要独立分发或对性能要求极高的场景。

相关文章:

  • SQL Server执行安装python环境
  • 用OMS从MySQL迁移到OceanBase,字符集utf8与utf8mb4的差异
  • Python实例题:高德API+Python解决租房问题
  • 室内烟雾明火检测数据集VOC+YOLO格式2469张2类别
  • 驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域绘制
  • 【专家库】Kuntal Chowdhury
  • 【挖洞利器】GobyAwvs解放双手
  • 基站综合测试仪核心功能详解:从射频参数到5G协议测试实战指南
  • RabbitMQ-api开发
  • 天文探秘学习小结
  • Java 函数式编程
  • 基于GA遗传优化的不同规模城市TSP问题求解算法matlab仿真
  • 删除排序链表中的重复元素:三种解法详解
  • 【Python-Day 10】Python 循环控制流:while 循环详解与 for 循环对比
  • ETL交通行业案例丨某大型铁路运输集团ETL数据集成实践
  • 购物数据分析
  • 双系统电脑中如何把ubuntu装进外接移动固态硬盘
  • 云境天合水陆安全漏电监测仪—迅速确定是否存在漏电现象
  • 算法每日一题 | 入门-顺序结构-三角形面积
  • 第十一届蓝桥杯 2020 C/C++组 蛇形填数
  • 印巴局势快速升级,外交部:呼吁印巴以和平稳定的大局为重
  • 重庆动物园大熊猫被游客扔玻璃瓶,相同地方曾被扔可乐瓶
  • 一网红被指涉脱衣殴打霸凌事件,沈阳警方:刑拘1人,处罚5人
  • 长沙天心阁举办古琴音乐会:文旅向深,让游客听见城市的底蕴
  • “模”范生上海,如何再进阶?
  • 玉渊谭天丨是自保还是自残?八个恶果透视美国征收100%电影关税