静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件.
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。
如果在当前工程中有多处对dll文件中同一个函数的调用,那么执行时,这个函数只会留下一份拷贝。但是如果有多处对lib文件中同一个函数的调用,执行时,该函数将在当前程序的执行空间里留下多份拷贝,而且是一处调用就产生一份拷贝。
DLL Hell 在计算中,DLL地狱(DLL Hell)是使用与Microsoft Windows操作系统一起使用的动态链接库(DLL)时出现的复杂性的术语,特别是传统的16位版本,它们都在单个内存空间中运行。
DLL Hell可以通过许多不同的方式表现出来,其中应用程序无法启动或正常工作。
DLL Hell是Windows生态系统特定形式的一般概念依赖地狱。
代码装载速度快,执行速度略比动态链接库快;
只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。
但是,使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费空间
PS:应用程序中DLL Hell的一个简单解决方案是静态链接所有库,即包含程序中所需的库版本,而不是选择具有指定名称的系统库。这在C / C ++应用程序中很常见,其中不必担心安装了哪个版本的MFC42.DLL,而是将应用程序编译为静态链接到相同的库。这完全消除了DLL,并且可以在仅使用提供静态选项的库的独立应用程序中实现,就像Microsoft基础类库一样。然而,牺牲了DLL的主要目的,即程序之间的运行时库共享以减少内存开销。在多个程序中复制库代码会导致软件膨胀,并使安全修复程序或更新版本的相关软件的部署变得复杂。
动态链接库的优缺点适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
更加节省内存并减少页面交换;
DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
缺点是速度慢,兼容性比较差