微信好友有的显示微信手机号加好友 有的不显示

8.动态链接dll与静态库相比有什么区别?_碧露凝心吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3贴子:
8.动态链接dll与静态库相比有什么区别?
答:动态链接库和静态链接库的区别:静态链接库在编译期把所有的代码和数据都生成到执行程序,运行时就不再需要库了。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态链接库在编译期只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入.动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
贴吧热议榜
使用签名档&&
保存至快速回贴动态链接的优点
动态是一种更为现代的方法,它的优点为是可执行文件的体积可以非常小。缺点是运行速度慢一些,但动态链接能够更加有效地利用磁盘空间,而且链接-编辑阶段的时间也会缩短(因为链接器的有些工作被推迟到载入时)。
尽管单个可执行文件的启动速度稍受影响(事实上如果只有一个进程使用库,完全没必要使用动态链接,没有内存空间的优势,反而影响了速度。下面的内容会理解这一点),但动态链接可以从两个方面提高性能:
1.动态链接可执行文件比功能相同的静态链接可执行文件的体积小。它能够节省磁盘空间和虚拟内存,因为函数库只有在需要时才被映射到进程中。以前,避免把函数库的拷贝绑定到每个可执行文件惟一方法就是把服务置于内核中而不是函数库中,这就带来了可怕的“内核膨胀”问题。(既然这里提到了内核,那就说明下我对动态链接的理解吧:它的实现和系统调用有共通之处。系统调用就是内核提供给应用程序的服务,内核提供一个系统调用表给c库函数,当用户调用库函数时,一般情况下该库函数就对应着一个或多个系统调用,而系统调用是通过名与调用号来作一一对应的,即在系统调用表中,印象中库函数调用内核函数时,要传系统调用号(不确定),参数等进来,这些都有统一的接口的,具体要看下内核设计那本书了。或改天再写篇文章上来,记得在QQ空间里有了一篇。到了这里,我猜想动态库也差不多这样,有一个函数表,函数名与调用号一一对应,当客户调用动态库的函数时,过程类似于进行系统调用。这让动态链接有一个最大的优点,只要接口形式不变,任意发动接口的内部实现,不会影响到客户,动态库实现改变了,客户不用重新链接,因为它运行时是通过调用号去找到相应的函数。如果动态库增加了函数或减少了函数,那是属于已经改变了接口形式,当然得重新编译客户程序。这也像unix的内核,内核升级了,并不会影响应用,因为应用只是通过接口去使用系统服务。如果内核修改了调用号,那将是灾难。)
2. 所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝。操作系统内核保证映射到内存中的函数库可以被所有使用它们的进程共享。这就提供了更好的I/O和交换空间利用率,节省了物理内存,从而提高了系统的整体性能。如果可执行文件是静态链接的,每个文件都将拥有一份函数库的拷贝,显然极为浪费。
例如,如果你有八个基于XView函数库的应用程序正在运行,只需要把一个XView函数文件段映射到内存中,第一个进程的mmap调用(系统调用mmap()把文件映射到进程的地址空间中。这样,文件的内容可以通过读取连续的内存地址来获得。当文件包含可执行文件的指令时,这种方法尤为适宜。在SVr4系统中,文件系统被虚拟内存系统的一部分,而mmap就是一种把文件映射到内存的机制。)将使内核把共享对象映射到内存中。其余七个进程的mmap调用将使内核把已经映射到内存中的对象由各个进程共享。这八个进程的每一个都将共享内存中的同一份XView函数库拷贝。如果函数库是静态链接的,钭会有八份函数库拷贝映射到内存中,这将消耗更多的物理内存,引起更多的换页。(再回忆下之前说过的,如果只有一个进程使用动态库,没必要使用动态链接的言论:没有省内存,反而牺牲了速度,当然省了磁盘空间。)
动态链接使得函数库的版本升级更为容易。新的函数库可以随时发布,只要安装到系统中,旧的程序就能够自动获得新版本函数库的优点为而无需重新链接。(如果是静态链接,库的改动,客户就被迫重新链接)
最后(虽然并不常见,但仍可能出现),动态链接允许用户在运行时选择需要执行的函数库,这就使为了提高速度或提高内存使用效率或包含额外的调试信息而创建新版本的函数库是完全可能的,用户可以根据自己的喜好,在程序执行时用一个库文件取代另一个库文件。(正如像系统调用可以被替换一样,动态库也可以:钩子技术)
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。程序动态链接、静态连接的对比优缺点
&为什么要动态链接?
也可以问,动态链接相对于静态连接有啥好处?首先明确动态链接和静态连接的区别:静态连接就是在程序编译阶段,将程序需要的所有东西打包放到一起;而动态链接是在程序需要运行时,根据需要动态的决定链接哪一个库,哪一个函数。
举个例子,每个人就是一个程序,磁盘就是一间房子,库文件就是人们生活的必需品(如锅碗瓢盆),静态连接就是:每个人都带着自己的锅碗瓢盆进入一间房子,房子里只有一个炉子可用(单核CPU),每个人做饭过程相当于进程执行。人少还行,人多了房子就很挤,其实不必要每个人都带一套锅碗瓢盆,把锅碗瓢盆放到那里,谁想用就排队,顺序使用(单核CPU在同一时刻只能运行一个进程)就行。例子不很恰当,能明白就行。
1、节省内存空间、磁盘空间
因为静态连接需要将公用的函数链接到程序中,就像每个人都有一套锅碗瓢盆,这样当然浪费磁盘空间,而且运行时每个进程都要有自己的函数,浪费内存空间。
2、软件更新容易,因为只更新库就行。
更新库就相当于更新锅碗瓢盆。
3、减少物理页面的换入换出,增加CPU cache命中率
程序具有局部性原理。
4、适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
5、增加程序可扩展性、兼容性。
动态链接文件可以在程序运行时链接,所以所有软件的插件就是这么做的。关于更好的兼容性是因为,只要库提供的功能相同,在不同的OS之间运行同一个软件是很容易的,而静态连接换了OS就需要重新编译,使用目标OS中的库重新链接。
动态链接的缺点:
1、当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。
2、动态链接相比静态连接有些慢,但是很少1%-5%性能损失。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
记录一下,下次搞不清可以来看看. 静态编译/动态编译 静态编译:是指编译器在编译可执行文件的时候,将可执行文件需要调用的对应的动态链接库中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候可以不依赖动态链接库. 动态编译:动态编译的可执行文件需要附带一个动态链接库,在执行时,需要调用其动态链接库中的命令.所以其优点是缩小了执行文件本身的体积,另一 ...
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称&静态库&),另一种为动态连接库(DLL,以下简称&动态库&)的导入库(Import Libary,以下简称&导入库&).
静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文 ...
如果你编写过线程或者与POSIX通信方式相关的程序的时候,你可能在编译链接的时候出现编译错误的情况,这个时候你会在gcc后面加一个参数,-lpthread(对于线程相关的程序而言),其实这个就是一个静态链接库libpthread.a.
链接库有两种:静态链接库和动态链接库.动态链接库的后缀名一般为.so,静态链接库的后缀名一般为.a. 静态链接库: ...
参考http://yxbwuhee./.html 一.C++动态调用Fortran DLL
(1)创建FORTRAN DLL工程,生成forsubs.dll文件供调用. ! forsubs.f90 ! ! FUNCTIONS/SUBROUTINES exported from FORSUBS.dll: ! FOR ...
静态链接与动态链接 静态链接是指:把库里面的函数在链接时就链接到执行文件中,即在可执行文件中嵌入了该文件所用到的库文件代码.在可执行文件运行时,链接的库文件代码会加载到内存. 动态链接是指:库函数不会嵌入到可执行文件中,可执行文件获取库函数指针,在运行时才去链接库函数. 简单的说,静态库和应用程序编译在一起,在任何情况下都能运行,而动态库是动态链接,顾名思义 ...
第7章 动态链接 为什么要动态链接 静态链接的缺点:(多副本)浪费内存和磁盘空间.模块更新困难等 动态链接:等到程序运行时才进行链接,它提高了程序的可扩展性(可作为为插件)和兼容性 动态链接的基本思想是把程序按照模块拆分成各个相对独立的部分,在程序运行时才将它们连接在一起形成完整的程序. 动态链接库:Linux的DSO,Windows的DLL.普通可执行程序 ...
引言 即使是最简单的HelloWorld的程序,它也要依赖于别人已经写好的成熟的软件库,这就是引出了一个问题,我们写的代码怎么和别人写的库集成在一起,也就是链接所要解决的问题. 首先看HelloWorld这个例子: // main.c 1 #include &stdio.h& 2 3 int main(int argc, char argv) 4 ...
转载自:http://www.jb51.net/article/34990.htm
根据链接时期的不同,库又有静态库和动态库之分,有别于静态库,动态库的链接是在程序执行的时候被链接的 1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删 ...

我要回帖

更多关于 查看微信好友的手机号 的文章

 

随机推荐