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

静态库和动态库的区别

简而言之:静态库是.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.xdnf.cn/news/4206.html

相关文章:

  • 【强化学习】什么是强化学习?2025
  • tp8+swoole搭建
  • 5.2创新架构
  • Linux/AndroidOS中进程间的通信线程间的同步 - 虚拟内存操作
  • 20250506让NanoPi NEO core开发板使用Ubuntu core16.04系统的TF卡启动
  • 德尔菲法和层次分析法是什么
  • 基于STM32、HAL库的W25Q32JVSSIQ NOR FLASH存储器驱动应用程序设计
  • 【日撸 Java 三百行】Day 3(注释,基本if语句,函数调用)
  • Vue 2.0 详解全教程(含 Axios 封装 + 路由守卫 + 实战进阶)
  • OpenCV 图形API(78)图像与通道拼接函数-----调整图像大小的函数resize()
  • C# 方法(值参数和引用参数)
  • mysql 如何查询数据库链接日志
  • Spring 中四种常见初始化方法,对比 static {} 和 @PostConstruct 在并发,Spring 加载顺序大致为: JVM 加载类
  • 生成了一个AI算法
  • 网络安全的范式革命:从被动防御到 AI 驱动的主动对抗
  • 基于大模型的自然临产阴道分娩全流程预测与方案研究报告
  • 开个帖子记录一下自己学spring源码的过程
  • Spyglass:官方Hands-on Training(三)
  • 数据中台架构设计
  • c++类【发展】
  • 【全面解析】Poco C++ Libraries 模块详解与使用指南
  • UE5 使用插件进行Audio2face和UE5的实时链接并实时输出嘴型
  • 多模态训练与微调
  • 突破v0.dev对话限制的两种方法
  • k8s node 报IPVS no destination available
  • 19.第二阶段x64游戏实战-vector容器
  • 二叉树的最大深度(简单)
  • 标题:基于自适应阈值与K-means聚类的图像行列排序与拼接处理
  • LintCode第484题-交换数组两个元素,第9题-Fizz Buzz 问题,第46题-主元素,第50题数组剔除元素后的乘积
  • 超表面加工流程