静态链接库(lib)与动态链接库(dll)
[lib]
在静态链接情况下,函数和数据被编译进一个二进制文件(*.lib),IDE在处理程序代码时将从lib中恢复这些函数和数据,并把他们和应用程序中的其他模块组合在一起,生成可执行文件。此时,因为应用程序所需的全部内容都是从库中复制出来的,所以lib本身并不需要与可执行文件一起发行。
静态链接库的缺点:静态链接库在多任务环境中运行时效率可能很低,如果两个应用程序同时运行,且使用了库中的同一个函数,那么就要求系统提供函数的两个副本,降低了内存的使用效率。
[dll]
在动态链接的情况下,有两个文件,一个是引入库(.lib)文件,一个是dll文件。引入库文件包含被dll导出的函数的名称和位置,dll包含实际 的函数和数据。应用程序使用lib文件链接到所需要使用的dll文件,库中的函数和数据并不复制到可执行文件中,因此,在应用程序的可执行文件中,存放的不是被调用的函数代码,而是dll中所要调用的函数的内存地址。这样,当一个或多个应用程序运行时,会把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
[使用dll的优点]
(1) 共享代码、资源和数据。
使用dll的主要目的就是为了共享代码,dll的代码可以被所有的Windows应用程序共享。
(2) 节省磁盘空间。
许多应用程序可在磁盘上共享dll的一个副本。
(3) 更新产品更容易。
当dll中的函数发生更改时,只要函数的参数和返回值没有更改,就不需要重新编译或重新链接使用它们的应用程序。相反,静态链接的对象代码要求在函数更改时重新链接应用程序。
(4) 提供售后支持。
例如,可修改显示器驱动程序dll以支持当初交付应用程序时不可用的显示器。
(5) 支持多语言程序。
只要程序遵循函数的调用约定,用不同的编程语言写的程序就可以调用相同的dll函数。程序与dll函数在下列方面必须是兼容的,函数期望其参数被推送到堆栈上的顺序、是函数还是应用程序负责清理堆栈,以及寄存器中是否传递了任何参数。
(6) 提供了扩展MFC类库的机制。
可以从现有的MFC类派生类,并将它们放到MFC扩展dll中供MFC应用程序使用。
(7) 隐藏实现的细节。
在dll中的方法可以被应用程序访问,而应用程序并不知道这些方法的细节。
(8) 拓展开发工具的功能。
由于dll是与语言无关的,因此可以创建一个dll,被C++、VB或任何支持动态链接库的语言调用。这样如果一种语言存在不足,就可以通过访问另一种语言创建的dll来弥补。
[dll和exe的区别]
创建一个dll的过程非常类似于创建可执行文件的过程。尽管dll和应用程序都是可执行的程序模块,但它们之间有若干不同之处。对于最终用户来说,最明显的差异在于dll不是可直接执行的程序。从系统角度讲,应用程序和dll之间存在以下两个基本差异:
(1) 应用程序可有多个同时在系统上运行的实例,而dll只能有一个实例。
(2) 应用程序可以拥有堆栈、共用内存、文件句柄、消息队列这样的事物,而dll不能。