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

C++动态库和静态库的特点以及区别

目录

  • 命名规则
  • 使用方式
  • 发布方式
  • 资源占用
  • 运行效率
  • 更新方式
  • 加载方式
  • 其他

C++的库文件包括动态库和静态库两种,可以说是开发的时候必然会接触的内容,应该都很熟悉了,这篇文章就简单聊一下这两种库的特点以及区别。

命名规则

在Windows系统中动态库是后缀为.dll的文件,比如demo.dll,静态库是后缀为.lib的文件,比如demo.lib,此外在Windows系统中动态库可能会有相关联的导入库,这些导入库的文件名后缀也是.lib,比如动态库demo.dll的导入库会是demo.lib,这个导入库虽然文件名和静态库一样,但是实际上完全不一样。

在Linux系统中动态库又叫共享库,是后缀为.so的文件,静态库是后缀为.a的文件,此外在Linux系统中,动态库和静态库的文件名都会有个前缀lib,比如libdemo.so、libdemo.a,这个是必须遵守的命名规则。

使用方式

在编译链接的时候,静态库中的代码会完全整合到可执行程序中,这就意味着可执行程序运行时就不需要静态库文件了,因为所有需要的代码都已经在可执行程序中了。

动态库在编译链接时不会整合到可执行程序中,而仅仅是在可执行程序中记录了一些符号,在可执行程序运行时这些动态库也会加载到内存中,可执行程序运行时根据记录的符号找到并使用加载到内存中的动态库的代码。

发布方式

因为可执行程序运行时不需要静态库文件,所以可执行程序可以独立发布。

因为可执行程序运行时需要依赖动态库,所以动态库需要和可执行程序一起发布。

资源占用

因为静态库中的代码会完全整合到可执行程序中,所以可执行程序会比较大,如果多个可执行程序依赖同一个静态库,那么这多个可执行程序就都整合了同一个静态库,也就相当于在系统中存储了多份同一个静态库,而且这多个可执行程序同时运行时,也会导致相当于同一个静态库在内存中加载了多份,比较浪费磁盘资源以及内存资源。

因为动态库并不会整合到可执行程序中,所以可执行程序不会很大,而且即使多个可执行程序依赖同一个动态库,在系统中也只需要存一份动态库文件就可以,此外多个可执行程序在运行时可以使用加载到内存中的同一个动态库,所以动态库也只需要加载到内存中一份就可以了,比较节省磁盘资源以及内存资源。

运行效率

因为使用静态库的可执行程序比较大,加载就会相对较慢,但是运行的时候因为是一个整体,所以相对较快。

因为使用动态库的可执行程序相对不大,加载相对比较快,但是因为不是一个整体,运行相对较慢。

更新方式

如果静态库更新了,使用静态库的可执行程序要使用更新后的静态库,那就必须重新编译,成本较高。

如果动态库更新了,如果能做到二进制兼容,那么可执行程序就不需要重新编译,只需要将系统中的动态库换成新的就可以,成本较低而且比较灵活。当然如果是二进制不兼容的更新,那可执行程序也需要重新编译。

加载方式

因为动态库和可执行程序是独立的,所以动态库还有一个特点,就是在可执行程序运行的时候,动态库可以是直接一起加载到内存中,也可以是由可执行程序根据需要,在运行时动态的加载和卸载动态库。而对于静态库而言,因为已经整合到可执行程序中了,就相当于是随着可执行程序一起加载了。

其他

此外并不只是可执行程序才能依赖库文件,库文件一样可以依赖库文件,比如一个动态库也可以依赖另一个动态库。

一般来讲还是动态库使用比较广泛。


http://www.kler.cn/a/389654.html

相关文章:

  • python魔术方法的学习
  • 【ChatGPT】 如何让ChatGPT分析数据并得出结论
  • LeetCode【0031】下一个排列
  • 【再谈设计模式】抽象工厂模式~对象创建的统筹者
  • Web安全之SQL注入---基础
  • Mit6.S081-实验环境搭建
  • WPF中Prism框架的简单使用
  • Linux——gcc编译过程详解与ACM时间和进度条的制作
  • 批量从Excel某一列中找到符合要求的值并提取其对应数据
  • 【笔记】LLC电路工作频点选择 2-1 输出稳定性的限制
  • 数学建模-----假设性检验引入+三个经典应用场景(三种不同的假设性检验类型)
  • 【React】深入理解 JSX语法
  • ReactPress 安装指南:从 MySQL 安装到项目启动
  • Pr 视频过渡:沉浸式视频 - VR 随机块
  • 去中心化存储:Web3中的数据安全新标准
  • linux网络管理基本知识
  • dapp获取钱包地址,及签名
  • 阿里公告:停止 EasyExcel 更新与维护
  • LlamaIndex RAG实践 | 书生大模型
  • 【RabbitMQ】04-发送者可靠性
  • Spark中给读取到的数据 的列 重命名的几种方式!
  • 如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息
  • 跨域及解决跨域
  • 使用腾讯地图的 IP 定位服务。这里是正确的实现方式
  • 字节青训-游戏排名第三大的分数、补给站最优花费问题
  • vite-plugin-electron 库作用