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

【C++】什么是静态库?什么是动态库?

静态库与动态库详解

静态库和动态库是软件开发中两种不同的代码共享和重用机制,它们在链接方式、内存使用和部署方式上有显著区别。

一、静态库(Static Library)

基本概念

静态库是在编译期间被完整复制到最终可执行文件中的预编译代码集合。

主要特点

  1. 链接时机:编译时链接(构建阶段)
  2. 文件形式
    • Windows: .lib 文件
    • Linux/Unix: .a (Archive)文件
  3. 内存使用:库代码会被复制到每个使用它的程序中
  4. 部署方式:成为可执行文件的一部分,无需单独分发
  5. 更新方式:需要重新编译整个程序

工作流程

  1. 开发者编写库代码
  2. 编译生成目标文件(.obj/.o)
  3. 打包成静态库文件(.lib/.a)
  4. 其他程序链接时,所需代码从静态库提取并合并到最终可执行文件中

优点

  • 部署简单(单个可执行文件)
  • 无运行时依赖
  • 性能可能略好(无动态链接开销)
  • 更好的代码保护(库代码被整合)

缺点

  • 可执行文件体积较大
  • 相同库代码在内存中有多个副本
  • 更新需要重新编译整个程序

典型应用场景

  • 小型工具程序
  • 性能敏感的核心组件
  • 嵌入式系统开发
  • 需要封闭源代码的库

二、动态库(Dynamic Library)

基本概念

动态库是在程序运行时才被加载的共享代码库。

主要特点

  1. 链接时机:运行时加载(执行阶段)
  2. 文件形式
    • Windows: .dll (Dynamic Link Library)
    • Linux: .so (Shared Object)
    • macOS: .dylib (Dynamic Library)
  3. 内存使用:多个程序可共享同一份库代码
  4. 部署方式:需要随程序一起分发或确保系统已安装
  5. 更新方式:替换库文件即可(需注意版本兼容)

工作流程

  1. 开发者编写库代码
  2. 编译生成动态库文件(.dll/.so)
  3. 程序运行时由操作系统加载器将库映射到内存
  4. 多个程序可共享同一份加载的库代码

优点

  • 节省内存(多进程共享)
  • 可执行文件体积小
  • 更新方便(无需重新编译主程序)
  • 支持插件架构

缺点

  • 部署较复杂(需确保库文件存在)
  • 可能存在版本冲突
  • 轻微的性能开销(加载和符号解析)

典型应用场景

  • 大型应用程序(如Office套件)
  • 需要热更新的系统
  • 提供插件机制的软件
  • 操作系统API实现

三、核心区别对比

特性静态库动态库
链接时机编译时运行时
文件独立性合并到可执行文件中独立文件
内存占用每个进程独立副本多进程共享
更新方式需重新编译替换库文件即可
加载速度启动快(无加载开销)启动稍慢(需加载库)
部署复杂度简单(单文件)较复杂(需附带库文件)
版本控制无版本问题需处理版本兼容性

四、动态链接库的种类

Windows系统

  • 标准DLL (.dll)
    • 最常见的动态链接库格式
    • 包含可执行代码、数据和资源
  • ActiveX DLL (.ocx)
    • 专为ActiveX控件设计的DLL
    • 包含COM对象实现
  • 驱动程序DLL (.sys)
    • 设备驱动程序的实现形式

Linux/Unix系统

  • 共享对象 (.so)
    • 类似于Windows的DLL
    • 命名通常包含版本号(如libxyz.so.1.2)

macOS系统

  • 动态库 (.dylib)
    • macOS特有的动态库格式
  • 框架(Frameworks)
    • 包含动态库及其相关资源的捆绑包

五、静态链接库的种类

Windows平台

  • COFF格式的.lib文件
    • 传统Windows静态库格式
    • 包含目标代码的集合
  • 导入库(Import Library, 特殊.lib文件)
    • 用于链接动态库(DLL)的辅助库
    • 不包含实际代码,只有DLL的导出符号表

Linux/Unix平台

  • ar格式的.a文件
    • 使用ar工具创建的归档文件
    • 命名通常为lib<name>.a
  • 瘦归档(Thin Archive)
    • 不实际包含目标文件,只保留文件路径引用
    • 节省磁盘空间

macOS平台

  • .a静态库
    • 类似Unix的ar格式
  • 通用二进制库(Universal Binary)
    • 包含多种架构代码(x86_64, arm64等)
http://www.lryc.cn/news/2386043.html

相关文章:

  • 项目阅读:Instruction Defense
  • springboot中拦截器配置使用
  • 用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来!
  • 在机器学习中,L2正则化为什么能够缓过拟合?为何正则化等机制能够使一个“过度拟合训练集”的模型展现出更优的泛化性能?正则化
  • day36 python神经网络训练
  • k8s部署ELK补充篇:kubernetes-event-exporter收集Kubernetes集群中的事件
  • 【Excel VBA 】窗体控件分类
  • C++性能相关的部分内容
  • Spring Boot 项目中常用的 ORM 框架 (JPA/Hibernate) 在性能方面有哪些需要注意的点?
  • 基于大模型的大肠癌全流程预测与诊疗方案研究报告
  • 解决DeepSeek部署难题:提升效率与稳定性的关键策略
  • AI进行提问、改写、生图、联网搜索资料,嘎嘎方便!
  • GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo
  • 2021年认证杯SPSSPRO杯数学建模A题(第二阶段)医学图像的配准全过程文档及程序
  • CV中常用Backbone-3:Clip/SAM原理以及代码操作
  • RPC 协议详解、案例分析与应用场景
  • dify-plugin-daemon的.env配置文件
  • 【Python】开发工具uv
  • 《技术择时,价值择股》速读笔记
  • Python可视化设计原则
  • SAP重塑云ERP应用套件
  • 2025.5.25总结
  • (九)PMSM驱动控制学习---无感控制之高阶滑膜观测器
  • 6个跨境电商独立站平台
  • 电子电路:电学都有哪些核心概念?
  • SQL进阶之旅 Day 2:基础查询优化技巧
  • 时序数据库 TDengine × Superset:一键构建你的可视化分析系统
  • 一键化部署
  • Win 系统 conda 如何配置镜像源
  • Devicenet主转Profinet网关助力改造焊接机器人系统智能升级