摘要:动态链接库技术实现和设计程序常用的技术,在 Windows 和 Linux 系统中都有动态库的概念,采用动态
库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。但不同操作系统
的动态库由于格式不同,在需要不同操作系统调用时需要进行动态库程序移植。本文分析和比较了两种操作系
统动态库技术,并给出了把 Visual C++编制的动态库移植到 Linux 上的方法和经验。
1、引言
动态库(Dynamic Link Library abbr,DLL)技术是程序设计中经常采用的技术。其目的减少程序的大小,节省
空间,提高效率,具有很高的灵活性。采用动态库技术对于升级软件版本更加容易。与静态库(Static Link
Library)不同,动态库里面的函数不是执行程序本身的一部分,而是根据执行需要按需载入,其执行代码可以
同时在多个程序中共享。
在 Windows 和 Linux 操作系统中,都可采用这种方式进行软件设计,但他们的调用方式以及程序编制方式不尽
相同。本文首先分析了在这两种操作系统中通常采用的动态库调用方法以及程序编制方式,然后分析比较了这
两种方式的不同之处,最后根据实际移植程序经验,介绍了把 VC++编制的 Windows 动态库移植到 Linux 下的
方法。
2、动态库技术
2.1 Windows 动态库技术
动态链接库是实现 Windows 应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。常见的动
态库包含外部函数和资源,也有一些动态库只包含资源,如 Windows 字体资源文件,称之为资源动态链接库。
通常动态库以.dll,.drv、.fon 等作为后缀。相应的 windows 静态库通常以.lib 结尾,Windows 自己就把一些主要
的系统功能以动态库模块的形式实现。
Windows 动态库在运行时被系统加载到进程的虚拟空间中,使用从调用进程的虚拟地址空间分配的内存,成为
调用进程的一部分。DLL 也只能被该进程的线程所访问。DLL 的句柄可以被调用进程使用;调用进程的句柄可
以被 DLL 使用。DLL 模块中包含各种导出函数,用于向外界提供服务。DLL 可以有自己的数据段,但没有自己
的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;
DLL 的编制与具体的编程语言及编译器无关,可以通过 DLL 来实现混合语言编程。DLL 函数中的代码所创建的
任何对象(包括变量)都归调用它的线程或进程所有。
根据调用方式的不同,对动态库的调用可分为静态调用方式和动态调用方式。
(1)静态调用,也称为隐式调用,由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(Windows
系统负责对 DLL 调用次数的计数),调用方式简单,能够满足通常的要求。通常采用的调用方式是把产生动态
评论2