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

embedded/2024/11/14 21:02:24/

目录

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

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.ppmy.cn/embedded/136814.html

相关文章

Autosar CP Can State Mangement规范导读

CanSM的主要功能 CAN网络通信模式控制 管理CAN网络的启动、停止和不同通信模式(如全通信、静默通信、无通信)之间的切换。通过状态机实现对CAN网络状态的精确控制,确保网络在不同条件下稳定运行。错误处理与状态报告 根据AUTOSAR基础软件的错误分类方案处理错误,包括开发错…

【vue2.0入门】认识vue工程

目录 引言一、工程目录介绍1. package.json文件2. src\App.vue3. src\components 文件夹4. src\assets 文件夹5. node_modules 文件夹6. 其他 二、安装 vuejs devtools 插件1. 下载插件2. 配置插件3. 使用插件 三、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开…

MySQL压缩版安装详细图解

1.下载 mysql压缩包版本和msi版的安装方法不一样,下面的是压缩包版本的安装详细图解: 总地址下载地址:MySQL :: Download MySQL Community Server MySQL :: Download MySQL Community Server (Archived Versions) 压缩版下载MySQL :: Dow…

Qt_day3_信号槽

目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看,不能交互,信号槽可以让界面进行人机…

Spring MVC(一)

1. Spring MVC是什么? 搞清楚Spring MVC之前先搞清楚MVC是什么?MVC是一种架构设计模式,也就是一种思想,M是Model,V是View,C是Controller。他们之间的关系举一个例子来介绍。比如去饭店吃饭,一进…

分布式-锁

一、锁的业务场景 1、为什么要加锁? 在多线程环境下,针对一些共享资源往往会出现线程安全问题,需要加锁校准程序执行过程。 2、单机锁的类型 synchronized 关键字。 Lock 接口的锁。 atomic 包的封装类。 3、分布式场景中的锁 在分布…

Java反射原理及其性能优化

目录 JVM是如何实现反射的反射的性能开销体现在哪里如何优化反射性能开销 1. JVM是如何实现反射的? 反射是Java语言中的一种强大功能,它允许程序在运行时动态地获取类的信息以及操作对象。下面是一个简单的示例,演示了如何使用反射调用方法&#xff…

非关系型数据库(1)---MongoDB

目录 1.MongoDB 1.MongoDB的特点 2.MongoDB的应用场景 3.MongoDB与MySQL的比较 2.数据库操作 1. 创建数据库 2. 切换数据库 3. 查看所有数据库 4. 查看当前数据库 5. 删除数据库 6. 查看数据库统计信息 7. 备份数据库 8. 恢复数据库 9. 创建用户和授权 10. 删除用…