首页 理论教育 了解动态链接库|VisualC++高级编程

了解动态链接库|VisualC++高级编程

时间:2023-11-16 理论教育 版权反馈
【摘要】:动态链接库是在程序执行时,能被动态装载运行以完成一些通用功能的代码集合。与动态链接库相对应,还有一种称之为静态链接库的函数库。函数库的使用发生在链接阶段,因此,动态链接库和静态链接库使用上的区别就出现在这里。实际上,动态链接库中的代码也可以静态链接到可执行程序中去,不过此种链接占用系统空间很大,不提倡使用。在动态链接库技术中,还要用到两个概念:导入和导出。

了解动态链接库|VisualC++高级编程

动态链接库是在程序执行时,能被动态装载运行以完成一些通用功能的代码集合。它的英文缩写是DLL(Dynamic Link Library)。

从定义可以看出,动态链接库也是可执行的文件,只不过它不像普通的EXE文件那样可以直接运行,而是用来为其它可执行文件(包括EXE文件和其它的DLL)提供共享代码的函数库。与动态链接库相对应,还有一种称之为静态链接库的函数库。两者的主要区别是在使用方法上面。

一般来说,源程序要经过编译(Compile)和链接(Link,又可称为连接)两个阶段才能形成可执行代码。函数库的使用发生在链接阶段,因此,动态链接库和静态链接库使用上的区别就出现在这里。我们可以用一个例子来形象说明它们的区别。假如有一个程序,它包含一个函数Entry,Entry函数中又调用了库函数Function,Function把Entry的代码分成了两个部分,假定前半部分的代码用Forepart代表,后半部分的代码用Rearpart代表,这样,整个Entry函数的源代码就是如下:

Entry函数经过编译后,它的目标代码也分为这三个部分,要把这三部分组装的(链接)到一起形成可执行代码,采用静态链接和动态链接的处理方法是不一样的:静态链接程序时,Function函数的代码被完整地从库中提取出来插入到Entry函数中,如图3-1(a)所示;而动态链接程序时,Function的完整代码还放在库中,但是它的位置(地址)及相关说明会插入到Entry函数,见图3-1(b)。

(www.xing528.com)

图3-1 程序动态链接和静态链接示意图

当对目标代码进行链接生成可执行程序时,静态链接形成的Entry程序是完整的,从一台机器拷贝到另外一台机器上是能够运行的,但是程序的文件比较大;而动态链接形成的可执行程序在不同机器间迁移时,它要带着相应的库,否则就不能运行,相对而言,动态链接的文件本身比较小。

专门为静态链接程序而存放函数代码的库就是静态链接库(实际上应该叫做静态连接库,它并没有体现出链接的含义,但大家约定俗成都称之为“静态链接库”),否则就是动态链接库。如图3-1(b)所示,Function如果存放在动态链接库中,当程序执行到Function时,可以动态的加载这个库,并根据地址执行Function的具体代码,Function返回后又可以把库从内存中卸载。这种灵活地使用方式就是“动态链接”,相应地,所使用的库就是动态链接库。实际上,动态链接库中的代码也可以静态链接到可执行程序中去,不过此种链接占用系统空间很大,不提倡使用。

在动态链接库技术中,还要用到两个概念:导入和导出。导入是把DLL中的函数代码(或者其它数据)插入到应用程序中的过程或操作;导出是把DLL中的函数代码(或者其它数据)暴露出来而能够为其它应用程序所使用的过程或操作。当开发DLL时,要把一些函数(或者类等)导出,这些函数(或类)就称为导出函数(或导出类);而在使用DLL时,则是把DLL的导出内容导入到应用程序中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈