静态库与动态库的区别

news2024/10/7 8:25:15

静态库与动态库的区别

  • 静态库
  • 动态库

首先用OpenCV的开源库来举个例子了解一下库文件的分类:

在这里插入图片描述

bin文件夹里面放的都是dll文件;

lib文件夹里面放的都是伴随dll文件的动态lib文件;

staticlib文件夹里面放的才是真正的静态lib文件,和dll文件是独立的,没有任何关系的;

所以可以看出,lib文件是有静态lib和动态llib之分的。

了解了库文件的分类后,我们开始学习静态库与动态库的区别

静态库

什么是静态库?

一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件,如果你工程里只有一个lib.h和lib.cpp,那么编译后产生的lib文件实际上就是这一个lib.obj文件的一个集合,但是如果你工程里还有其他的很多个lib.cpp文件,那么就会在编译之后生成许多lib.obj文件,然后最终只链接生成一个静态lib文件,这就是静态库。也正是因为静态库中包含了所有的静态库的.obj文件,所以静态库包含了函数的完整实现。

为什么叫作静态库?

之所以称为静态库,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,如果静态库需要进行修改,那么需要将修改的静态库文件和目标文件重新链接打包到可执行文件中,因此对应的链接方式称为静态链接,对应的库就是静态库。

静态库特点总结:

  • 引用静态库时,在编译阶段会将静态lib文件和其他obj文件打包生成.exe可执行文件,因为静态库是任意个obj文件的集合,所以静态库包含了函数代码的完整实现,所以这里的.exe文件可以直接执行。以后再运行这个exe可执行文件时,也不再需要.lib文件,可以直接运行
  • 浪费空间和资源,因为静态lib文件实际上是包含了所有的导出声明和实现,你如果把这个lib文件链接到自己的程序之后,这个lib文件中的所有代码都会嵌入进来,哪怕你只用到了其中一部分,剩下没用到的也进了你的代码。这就不难想象会造成的后果了,虽然方便,但是如果大部分你都用不到,自然会导致你的库体积没有意义地变大。
  • 当静态链接库发生变化时,目的程序必须要重新编译,否则执行时静态链接库的内容没有更新,重新编译后再发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。

什么场合下适用静态库:

因为静态链接库会使得.exe文件的size变大,并且相对于动态链接库运行速度更快。故静态链接库适用于小型应用的开发。

动态库

为什么需要动态库?

其实也是静态库的特点导致。空间浪费是静态库的一个问题,另一个问题是静态库的更新问题。

什么是动态库?
一个dll工程生成一个dll文件的时候,总是伴随着生成一个lib文件,这个lib文件其实是一个动态的lib,它的大小比静态lib要小很多,动态链接库中的动态.lib并不包含由.cpp生成的目标文件,目标文件都包含在.dll中,.lib仅仅是提供链接到.DLL的地址信息等,即动态lib文件其实只是包含了一些函数索引信息,记录了dll中那些函数的入口和位置,dll中才是具体的函数实现。所以对于动态链接库来说,.lib和.dll缺一不可。主要体现在:在编译时如果你加了.lib的依赖项,不会出任何问题,但运行时,若没有.dll,会提示找不到xx.dll的信息。

为什么叫作动态库?
在编译阶段这个过程只需要用到这里的动态lib文件,然后将动态lib文件和你的代码打包到一起生成.exe可执行文件,动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,在运行期间,使用到动态库中的函数时,会通过动态.lib文件记录的函数索引信息找到函数正确的位于dll中的位置,然后直接执行那些函数就行了。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库(动态库可以实现进程之间的资源共享,因此动态库也称为共享库)所对应的动态lib文件,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新,是动态的。

正常情况下,发行一个软件的过程应该是这样的:

你的项目分成独立的几个模块,每个模块都有一个dll文件,然后有一个最终的程序入口exe文件,最后把dll文件和exe文件发行给用户。当用户每次点击这个exe文件的时候,自然会动态调用用到的dll文件。注意这个过程就不再需要什么.h和.lib了,那是别人调用你的库,再进行加工写代码时才需要做的事。上面说过dll其实就是个不能单独打开执行的exe而已,所以你最终发行给用户的只能是dll和exe(exe中包含了动态.lib文件,程序运行时通过动态.lib文件找到dll文件中相应函数的位置),当然你完全可以把所有的东西只打包在一个exe中。但是当你的软件非常大的时候,这样进行更新维护就非常不方便,如果有问题就得重新发行一次exe,但是如果把各个模块单独弄成dll,你只需要打个补丁(更新dll文件),然后对那些有问题的dll进行更换就行了。

调用动态库需要这些文件:

如果我们需要调用一个动态库,我们就需要.h文件,.lib文件,.dll文件,然后如果.dll文件封装的函数代码有改动,只需要重新编译一次dll,替换掉原来的dll就可以了,非常方便!!!当然前提是,这个动态库的函数接口写得好。进行修改时只需要修改内部实际的代码,并不需要对接口改来改去!

什么场合下适用动态链接库:

  • 因为静态链接库是和目标文件一起打包成为一个.exe可执行文件,所以该可执行文件不能链接其它链接库,无论静态库或者动态链接库。所以,当该当链接库还需要链接其它的链接库,包括静态或者动态链接库的场合,应该使用动态链接库。
  • 当库可能需要进行修正时,可以选择使用动态库,这样其应用程序不需要再次编译,只需要更新该.dll文件,然后替换掉旧的.dll文件即可,可以减少软件的耦合。
  • 由于动态链接库.dll可以链接到不同编程语言的工程,所以对于多语言的软件开发的场合也是适用的。
  • 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

参考资料:
https://blog.csdn.net/carlhelen/article/details/85157022?spm=1001.2014.3001.5506
https://blog.csdn.net/hm_123123123/article/details/125271876?spm=1001.2014.3001.5506
https://tool.4xseo.com/a/54522.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专利费减备案操作流程——让你申请专利时的官费大大打折

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…

【为什么控件的引用和控件的代理要用weak Objective-C语言】

一、还记得我们给大家说过,UI控件,当用一个属性,引用UI控件的时候,那个标记要用weak, 1.为什么,但是用strong,是不是也行, 但是,如果是控件的代理对象,是不是一定得用weak, 我现在就告诉你,为什么, 注意听,现在,比如说,这个是控制器, 我先解释,为什么UI控…

Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式)

场景 Java中基于JDK的LRU算法实现 LRU算法-缓存淘汰算法-Least recently used,最近最少使用算法 根据数据的历史访问记录来进行淘汰数据,其核心思想是:如果有数据最近被访问过,那么将来被访问的几率也更高 在Java中可以利用LinkedHashMap…

34. Linux系统下打包qt应用程序

1. 说明 对程序进行打包前需要在Release模式对程序代码进行编译,然后得到编译后的可执行文件,正常情况下这个可执行文件是可以双击打开运行的,如果无法双击运行,可在**.pro**文件内加入下面的代码: QMAKE_LFLAGS += -no-pie TEMPLATE = app同时将main.qml文件中的Window…

【总结】对接达梦数据库DM8详细教程

目录 1.达梦数据库-技术文档2.软件安装包下载2.1 iso 安装版2.2 docker 安装版 3.DM8单机安装部署规范4.安装操作步骤4.1 安装docker4.2 docker安装dameng(推荐) 5. 启动/停止数据库6.客户端连接使用7.DDL SQL实践7.1 创建表空间7.2 建表语句 8.DML SQL实…

「2023大学生就业报告 」出炉,应届生都去了哪些行业?

2023年的应届毕业生人数再创新高,达到1158万人,是不是开始担忧他们的就业了?别急,最近Boss直聘发布的一组数据,会让这样的担忧有所缓解。 期望薪资有所下降 和增长明显的毕业人数相反的是,这一届大专、本…

网络流量监控及流量异常检测

当今的企业面临着许多挑战,尤其是在监控其网络基础设施方面,需要确保随着网络规模和复杂性的增长,能够全面了解网络的运行状况和安全性。为了消除对网络性能的任何压力,组织应该采取的一项重要行动是使用随组织一起扩展的工具监控…

探究工业设备状态监测的典型对象和常用方法

工业设备状态监测的目的是实时掌握设备的健康状况,及时发现潜在故障迹象,并采取相应的维修和维护措施。通过有效的状态监测,企业可以降低设备故障风险,减少计划外停机时间,提高生产效率,节约维护成本&#…

深兰科技亮相2023数博会:硅基知识大模型推动个人数字化产业

近日,2023中国国际大数据产业博览会 “数字经济与实体经济深度融合”论坛在贵阳举行。腾讯云、京东集团、网易、深兰科技等8家企业负责人进行了行业演讲。 作为2023数博会的专业论坛之一,本次论坛以“数融百业 创变赋新”为主题,从数实融合视…

项目冲突管理机制的4大关键环节

1、冲突预防功能 预先采取一些措施防止冲突的产生,如建立有效的沟通机制。在项目开始前,制定沟通计划、沟通频率和方式,以确保项目成员充分了解自我职责和任务,并自愿分享和讨论。通过有效的沟通机制,最大限度避免不必…

QoS实现之限速

基于流分类(MQC)的流量监管 前面我们已经介绍过,流量监管一般用于入方向。下面举个例子,详细介绍如何在入方向配置基于MQC的流量监管。如图2所示,企业的语音业务对应的VLAN ID为120,视频业务对应的VLAN ID…

自学网安该怎么做以及怎么找工作?

趁着今天下班,我花了几个小时整理了下,非常不易,希望大家可以点赞收藏支持一波,谢谢。 我的经历: 我 19 年毕业,大学专业是物联网工程,我相信很多人在象牙塔里都很迷茫,到了大三大…

图解LeetCode——146. LRU 缓存

一、题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,…

什么才是自动化测试框架?最流行的自动化测试框架整理,你的进阶之路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

Smartbi助力航天百亿级遥测数据实现秒级查询

“Smartbi全程参与了火星探测任务、中国载人空间站建设任务,为航天任务参战单位提供专业、易用、高性能的实时数据查询分析监控平台,实现航天器飞行状态监测和预警,让咱们的科研人员专注聚焦科研工作,保障航天任务顺利进行。Smart…

Benewake(北醒) 快速实现 TF02-i-RS485 与电脑通信操作说明

目录 一、前言二、工具准备1. USB-RS485 转接器2. TF02-i-RS4853. 兆信直流电源4.连接线、绝缘胶带、螺丝刀5. PC:Windows 系统6. 串口助手软件 三、连接方式1. USB-RS485 转接板接口说明2. TF02-i-RS485 引脚定义3. 连接图 四、TF02-i-RS485 与电脑通信操作说明1. …

js中+new Date()

在学习js过程中遇到了这样的写法: var nownew Date(); 在这段代码中有一个号,上网查阅得知在前面加一个号是涉及到了隐式转换,也就是触发对象执行valueof进行求值。 valueof可以用来得到现在时间距离1970.1.1总的毫秒数: var …

Android12之源码手动生成aidl对应java/cpp/ndk/rust服务(一百五十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

【自动化项目实战】博客系统

目录 1.博客自动化测试用例 2.准备工作 3.将手工测试用例转化为自动化测试用例 3.1 初始化动作 3.2 登录 3.3 博客列表博客数量 3.4 查看全文 3.5 写博客&发表博客 3.6 删除 3.7 注销 4.总代码 🌈这节文章我们讲解一个实战项目——博客系统。首先我…

在前公司年薪38W,经人内推腾讯居然被拒了···

末流院校,带17人研发团队,到手38w股票20w,过硬的技术让我觉得可以出去“闯闯”;内推到某大厂,电话里聊得挺好,结果第二天说不给安排面试了…… 被拒绝很正常,想必应该是能力不足,不能满足公司的…