DLL动态链接库和LIB静态链接库

注:以下许多专业内容来自于百度百科,其间夹杂了我对dll和lib的一些个人认知。

动态链接库(DLL):

实质:一种不可执行的二进制程序文件,包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
生成:用vs生成dll时,会同时生成一个.dll文件和.lib文件。其中,.dll文件包含了具体的函数内容,在程序运行的时候被调用;.lib文件包含了函数所在的dll文件信息和文件中函数位置信息,程序编译的时候调用。即,程序编译的时候只需要.lib文件提供信息,程序运行则只需要.dll文件提供信息。
使用:分为显式调用(动态调用)和隐式调用(静态调用)。

隐式调用:需要.h文件,.dll文件和.lib文件。其中,头文件中包含了所调用函数用到的一些数据结构原型,导出函数声明等(方法:extern “C” _declspec(dllimport)),当然,也可以把这些直接放入你工程中的特定头文件。.lib放在目录下,可以通过#pragma comment(lib,“XXX.lib”)加载,也可以在项目→配置属性→链接器→输入→附加依赖项 中加入.lib文件。.dll文件也加入在项目目录下。【注:正如上面所说的,项目编译的时候,只需要.lib文件,编译好运行的时候,需要dll,所以软件编译好发布的时候,只需要配带dll即可】

显示调用:只需要.dll文件(如果所调用函数的输出或者输出包含了自定义数据类型也得自己提供)。方法:①定义所需要函数指针typedef int (*needfun)(hobject,HTupe&);②定义一个句柄HINSTANCE mydll;③加载dll mydll=LoadLibrary(“dll地址,一般直接放在当前项目,此时直接写dll名称即可”); ④获取函数地址 needfun myfun=(needfun)GetProcAddress(mydll, “函数名”);⑤使用后释放 if(mydll!=NULL) FreeLibrary(mydll);【优点:动态加载程序启动快速,易于维护,即可以直接修改替换对应的dll而不用重新编译程序】

##特点:【以下全部来自百度百科,扩展知识】①DLL的最初目的是节约应用程序所需的磁盘和内存空间。在一个传统的非共享库中,一部分代码简单地附加到调用的程序上。如果两个程序调用同一个子程序,就会出现两份那段代码。相反,许多应用共享的代码能够切分到一个DLL中,在硬盘上存为一个文件,在内存中使用一个实例(instance)。DLL的广泛应用使得早期的视窗能够在紧张的内存条件下运行。②DLL提供了如模块化这样的共享库的普通好处。模块化允许仅仅更改几个应用程序共享使用的一个DLL中的代码和数据而不需要更改应用程序自身。这种模块化的基本形式允许如Microsoft Office、Microsoft Visual Studio、甚至Microsoft Windows自身这样大的应用程序使用较为紧凑的补丁和服务包。③模块化的另外一个好处是插件的通用接口使用。单个的接口允许旧的模块与新的模块一样能够与以前的应用程序运行时无缝地集成到一起,而不需要对应用程序本身作任何更改。这种动态扩展的思想在ActiveX中发挥到了极致。④DLL也有一个缺点:DLL地狱,也就是几个应用程序在使用同一个共享DLL库发生版本冲突。这样的冲突可以通过将不同版本的问题DLL放到应用程序所在的文件夹而不是放到系统文件夹来解决;但是,这样将抵消共享DLL节约的空间。目前,Microsoft .NET将解决DLL hell问题当作自己的目标,它允许同一个共享库的不同版本并列共存。由于现代的计算机有足够的磁盘空间和内存,这也可以作为一个合理的实现方法⑤DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。

静态链接库(LIB):
实质:包含所有函数代码和数据的一个二进制文件(通常扩展名为*.lib)。vs的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
生成:用vs生成lib时,会生成一个lib库文件,它和生成dll时的动态lib不同,其内包含了所有函数内容(索引和实现),体积很大。
使用:使用lib需要二个文件:.h文件和.lib文件。其中,头文件中包含了函数调用时用到的一些数据结构原型和导出函数声明。和上面动态的lib一样,静态的lib可以在项目→配置属性→连接器→输入→附加依赖项 中加入.lib文件;或者在工程文件中直接加入#pragma comment(lib,“XXX.lib”)。
特点:包含函数代码本身,在编译时直接将代码加入程序当中。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。静态库对函数库的链接是放在编译期完成的,程序在运行的时候与函数库再无瓜葛,移植方便。缺点:浪费空间与资源,因为所有相关的目标文件与牵扯到的函数库会被合成一个可执行的文件。而且当库函数更新时,应用程序需要重新编译。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值