先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
目标库(Object Libraries)
目标库又叫静态链接库,是扩展名为.LIB的文件,包括了用户程序要用到的各种函数。它在用户程序进行链接时,“静态链接”到可执行程序文件当中。例如,在VC++中最常使用到的C运行时目标库文件就是LIBC.LIB。在链接应用程序时常使用所谓“静态链接”的方法,即将各个目标文件(.obj)、运行时函数库(.lib)以及已编译的资源文件(.res)链接到一起,形成一个可执行文件(.exe)。使用静态链接时,可执行文件需要使用的各种函数和资源都已包含到文件中。这样做的缺点是对于多个程序都使用的相同函数和资源要重复链接到exe文件中,使程序变大、占用内存增加。
静态网站和动态网站区别
动态链接库(Dynamic-Link Libraries)
“动态链接”是将一些公用的函数或资源组织成动态链接库文件(.dll),当某个需要使用dll中的函数或资源的程序启动时(准确的说是初始化时),系统将该dll映射到调用进程的虚拟地址空间、增加该dll的引用计数值,然后当实际使用到该dll时操作系统就将该dll载入内存;如果使用该dll的所有程序都已结束,则系统将该库从内存中移除。使用同一dll的各个进程在运行时共享dll的代码,但是对于dll中的数据则各有一份拷贝(当然也有在dll中共享数据的方法)。 动态链接库中可以定义两种函数:输出函数和内部函数。输出函数可以被其他模块调用,内部函数只能被动态链接库本身调用。动态链接库也可以输出数据,但这些数据通常只被它自己的函数所使用。
静态链接库与动态链接库的相同点:
1、共享代码;
2、代码封装;
静态链接库与动态链接库的区别:
1、静态链接库被包含在宿主程序中,而动态链接库则是在需要时动态地装载和卸载DLL文件;
2、静态链接库中不能再包含其它动态或者静态链接库,而动态链接库中则可再包含。
在VC中动态链接库如下分类:
Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
1、非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;
2、MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;
3、MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
在大型的应用软件中,会常常使用到动态链接库技术。举个例子,假如我们要写一个大型的
应用软件,其中包括了多个程序。我们可以发现很多程序可能都会使用到一些同样的通用的函数。我们可以把这些通用的函数放到某个目标库文件中(.LIB),然后在链接是把它加到每个程序中进行静态链接。但是这是一种非常浪费的方法,因为每个程序模块中都会包括这些通用函数的独立拷贝。另外,如果我们要改变库文件中的某个函数,就必须把所有使用到这个函数的程序都重新编译一遍。但是,如果我们使用动态链接库的技术,把所有这些通用函数都放到一个动态链接库文件当中,我们就可以解决以上提到的各种问题。首先,动态链接库在硬盘上只保留一个拷贝,程序只是在运行时才会调用其中使用到的函数,这样我们就可以节省大量的程序存储和运行空间。其次,如果要修改某个通用函数时,只要调用接口没有改变,只是改变它的实现方法,那么我们就不必对每个用到它的程序都进行重新编译,而只要把动态链接库模块重新编译一遍就可以了。
动态链接库模块也可以作为一个单独的产品来发布。这样程序开发人员就可以使用第三方的模块来开发自己的应用程序,提高了程序的复用程序,也节省了大量的时间和精力。
目标库和导入库都是在程序开发过程中才使用到的,而动态链接库是在程序运行时才使用的。在程序运行时,相应的动态链接库文件必须已经保存在硬盘上了。另外,如果要使用动
态链接库文件,该文件必须要保存在同.EXE文件同一个目录下,或者保存在当前目录、Windows系统目录、Windows目录或环境变量中PATH参数指定的目录下。程序也是按照这个顺序来搜寻它需要的动态链接库文件的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。