当前位置: 首页 > 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  # 设置库搜索路径
```

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

http://www.dtcms.com/a/174867.html

相关文章:

  • 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++组 蛇形填数
  • 第15章 Python数据类型详解之分解理解:基础数据类型常见易错点和性能优化篇
  • 【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题
  • 浅谈 - GPTQ为啥按列量化
  • JavaSE基础概述--Lambda表达式,方法引用,基础算法,异常以及序列化
  • pywinauto通过图片定位怎么更加精准的识别图片?
  • 关于tftpboot的用法
  • 计算机中的逻辑运算
  • 关于串口读写NAND闪存的用法
  • 多线程系列五:面试中常考的单例模式
  • SQL 与 Python:日期维度表创建的不同选择