首页 > 其他分享 >动态链接库

动态链接库

时间:2024-08-11 16:07:30浏览次数:14  
标签:文件 Program1 Lib 程序 模块 动态链接库 链接

空间浪费是静态链接的一个问题,另一个问题是静态链接对程序的更新、部署和发布也会带来很多麻烦。比如程序Program1所使用的Lib.o是由一个第三方厂商提供的,当该厂商更新了Lib.o的时候(比如修正了lib.o里面包含的一个Bug),那么Program1的厂商就需要拿到最新版的Lib.o,然后将其与Program1.o链接后,将新的Program1整个发布给用户。这样做的缺点很明显,即一旦程序中有任何模块更新,整个程序就要重新链接、发布给用户。比如一个程序有20个模块,每个模块1 MB,那么每次更新任何一个模块,用户就得重新获取这个20 MB的程序。如果程序都使用静态链接,那么通过网络来更新程序将会非常不便,因为一旦程序任何位置的一个小改动,都会导致整个程序重新下载。

动态链接库

要解决空间浪费和更新困难这两个问题最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态地链接在一起。简单地讲,就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说,把链接这个过程推迟到了运行时再进行,这就是动态链接(Dynamic Linking)的基本思想。

还是以Program1和Program2为例,假设我们保留Program1.o、Program2.o和Lib.o三个目标文件。当我们要运行Program1这个程序时,系统首先加载Program1.o,当系统发现Program1.o中用到了Lib.o,即Program1.o依赖于Lib.o,那么系统接着加载Lib.o,如果Program1.o或Lib.o还依赖于其他目标文件,系统会按照这种方法将它们全部加载至内存。所有需要的目标文件加载完毕之后,如果依赖关系满足,即所有依赖的目标文件都存在于磁盘,系统开始进行链接工作。这个链接工作的原理与静态链接非常相似,包括符号解析、地址重定位等,我们在前面已经很详细地介绍过了。完成这些步骤之后,系统开始把控制权交给Program1.o的程序入口处,程序开始运行。这时如果我们需要运行Program2,那么系统只需要加载Program2.o,而不需要重新加载Lib.o,因为内存中已经存在了一份Lib.o的副本(见图7-2),系统要做的只是将Program2.o和Lib.o链接起来。

很明显,上面的这种做法解决了共享的目标文件多个副本浪费磁盘和内存空间的问题,可以看到,磁盘和内存中只存在一份Lib.o,而不是两份。另外在内存中共享一个目标文件

模块的好处不仅仅是节省内存,它还可以减少物理页面的换入换出,也可以增加CPU缓存的命中率,因为不同进程间的数据和指令访问都集中在了同一个共享模块上。

上面的动态链接方案也可以使程序的升级变得更加容易,当我们要升级程序库或程序共享的某个模块时,理论上只要简单地将旧的目标文件覆盖掉,而无须将所有的程序再重新链接一遍。当程序下一次运行的时候,新版本的目标文件会被自动装载到内存并且链接起来,程序就完成了升级的目标。

标签:文件,Program1,Lib,程序,模块,动态链接库,链接
From: https://www.cnblogs.com/IServise/p/18353514

相关文章

  • DLL 动态链接库的创建与使用
    DLL动态链接库的创建与使用参考教程:DLL动态链接库的创建与使用(实例教程)-ElaineTiger-博客园(cnblogs.com)1.什么是动态链接库动态链接库是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件名的扩展名一般是dll,也有可能是dr......
  • pytorch OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败”原因分析
    动态链接库失败“OSError:[WinError1114]动态链接库(DLL)初始化例程失败。Errorloading"cublas64_12.dll"oroneofitsdependencies”原因分析出错情况:在importtorch中直接被抛出异常环境探讨【问题复现】:因为使用了新的torch-gpu环境【name称为torch】,固怀疑......
  • Linux下C++动态链接库的生成以及使用
    目录一.前言二.生成动态链接库三.使用动态链接库一.前言这篇文章简单讨论一下Linux下如何使用gcc/g++生成和使用C++动态链接库(.so文件)。二.生成动态链接库先看下目录结构然后看下代码//demo.h#ifndefDEMO_H#defineDEMO_H#include<string>classDemo{......
  • Windows下用CMake构建和编译第三方依赖库并向C:\Program Files\或C:\Program Files
    从CMake构建和编译第三方依赖库的步骤:1、下载第三方依赖库的源码,并解压到指定的目录中。2、在第三方依赖库的的源码所在的目录下(一般是src/目录下)创建一个文件夹build。3、打开CMakeGUI软件,按照常规步骤配置和产生针对某种编译器的解决方案文件,比如Visualstudio2019。如下如......
  • Python ctypes OSError:[WinError 1114]动态链接库(DLL)初始化例程失败
    我试图使用Python中的ctypes库调用C++函数:test.pyfromctypesimport*fromrandomimportrandinttester=cdll.LoadLibrary('./test.dll')print(tester.test(randint(1,100)))test.cpp#include<vector>intcppTest(intnum){std:......
  • 动态链接库的实现原理是什么?
    今天简单聊聊动态链接库的实现原理。假设有这样两段代码,第一段代码定义了一个全量变量a以及函数foo,函数foo中引用了下一段代码中定义的全局变量b。第二段代码定义了全局变量b以及main函数,同时在main函数中调用了第一个模块中定义的函数foo。接下来编译器出场,编译器会把这......
  • Windows下C++动态链接库的生成以及使用
    目录一.前言二.生成动态链接库三.使用动态链接库四.其他一.前言这篇文章简单讨论一下Windows下如何使用VS生成和使用C++动态链接库,示例使用VS2022环境。二.生成动态链接库先创建C++项目-动态链接库(DLL)然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保......
  • PE文件(八)静态与动态链接库
    本章内容为导入表和导出表的前置内容章节引入当我们需要重复使用一段代码时,我们可以将其定义成一个函数,每当使用这段代码时,直接调用函数即可但当我们进行多人大型项目时,一个人电脑上有一段代码需要另外很多人的电脑使用时,每次复制粘贴相应的代码到另外很多台电脑是很复杂的,......
  • MinGW GCC Boost Serialization 无法定位程序输入点 _ZSt19uncaught_exceptionsv 于动
     在Windows下使用MinGWGCC编译Boost和Demo程序,运行时报错:GCC: gccversion8.1.0(i686-posix-dwarf-rev0,BuiltbyMinGW-W64project)boost:boost1.85.0排查原因是GCC和Boost不匹配,适当降低boost版本后正常。GCC8.1是2018年,Boost1.85.0是2024年,时间差距比较大。......
  • Linux 运行时调用动态链接库的方法
    项目场景:Linux动态链接库调用自定义的动态链接库动态链接库:(1)编写.c和.h文件(2)将.c文件转成.o文件gcc-c*.c-fPIC(3)将.o文件转成动态库文件lib库名.sogcc-shared-olib库......