【正确答案】所谓库指的是把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用。具体而言,它是别人写好的、现有的、成熟的、可以复用的代码,只需要知道其接口如何定义,便可以简单方便地使用。而静态链接库(Static Link Library,LIB)与动态链接库(Dynamic Link Library,DLL)都是共享代码的方式。以下将分别对这两种方式进行介绍与对比分析。
动态链接库:在Windows操作系统中动态链接库的后缀为.dll,其中有3个最重要的DLL,分别是Ketaael32.dll、User32.dll和GDI32.dll。Linux操作系统中动态链接库的后缀为.so。动态链接库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单地引用,因此,它的代码体积较小。动态链接库的使用方式分为两种:一种是静态加载,即在应用程序启动时加载;一种是动态加载,即该动态链接库在被使用时才被应用程序加载。
通常,动态链接库的优点很多,主要有以下几点:
1)更加节省内存,并减少页面交换。多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可。
2)开发模块好,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分,具有很强的可维护性和可扩展性。例如,有一个大型网络游戏,如果把整个数百MB甚至数GB游戏的代码都放在一个应用程序里,未来的修改工作将会非常费时,而如果把不同功能的代码分别放在数个动态链接库中,则无须重新生成或安装整个程序就可以应用更新,但前提是要求设计者对功能划分得比较好。
3)不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数。
动态链接库的缺点如下:
1)不能解决引用计数。
2)使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败。
3)可能造成DLL地狱。DLL地狱(DLL Hell)指的是在微软的Windows系统中,因为动态链接库的版本或兼容性的问题而造成程序无法正常运行的情况。
静态链接库:函数和数据被编译进一个二进制文件(通常扩展名为.lib)。静态链接库的代码在编译过程中已经被载入可执行程序,因此,它的体积较大。在使用静态链接库的情况下,编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe文件)。静态链接库作为代码的一部分,在编译时被链接。
静态链接库的优点有以下两点:①代码的装载速度快,因为编译时它只会把需要的那部分内容链接进去,所以,其执行速度比动态链接库略快;②只需保证在开发者的计算机中有正确的.lib文件即可,在以二进制形式发布程序时不需考虑在用户的计算机上.lib文件是否存在及版本问题,可避免DLL地狱等问题。
当然,静态链接库的缺点也是很明显的:如果一个静态链接库被多个应用程序使用,则会被装载多次,浪费内存。
【答案解析】