动态库和静态库
区 别 |
|
静态库 |
动态库 |
将库文件中的二进制代码直接链接到目标文件,程序运行时不再需要库; |
将接口在库文件中的位置信息链接到目标文件,程序运行时再根据这些位置信息进行调用,因此运行时需要库文件; |
lib 中的指令都全部被直接包含在最终生成的目标文件中了; |
dll不必被包含在最终目标文件中,目标文件执行时可以“动态”地引用和卸载dll文件; |
静态链接库中不能再包含其他的动态链接库或者静态库; |
动态链接库中还可以再包含其他的动态或静态链接库; |
优缺点 |
|
静态库 |
动态库 |
静态库只需要编译的时候需要,运行的时候不需要,比较方便发布; |
动态库运行时需要将目标文件与库文件同时发布; |
静态库对于每个使用它的进程拷贝一份副本,如果进程很多,则对运行空间的要求比较高; |
动态库则是所有进程共享一份,但这样会有DLL Hell的风险; |
静态库不方便程序增量更新,如果lib更新了,则所有用到lib的目标文件都需要更新 |
动态库则只需要更新dll库本身 |
其 他 |
|
lib有静态lib和动态lib之分: 静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。 动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持。 通过#include包含这些函数声明的头文件后,我们的应用程序就可以使用lib文件中的函数。 |
|
动态库特点总结: 动态库把对一些库函数的链接载入推迟到程序运行的时期。 可以实现进程之间的资源共享。(因此动态库也称为共享库) 将一些程序升级变得简单。 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。 |
|
Use Static Libary,Static Linked DLL,Dynamic Linked DLL三个概念: 使用静态库(Use Static Libary): 把lib和链接到目标文件中,一般情况下,可以根本就没有“对应的”dll文件,如C Run Time(CRT)库。一个例子就是,写一个main(){},build出来并不是只有几个字节,当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸,build出的执行文件仍然“莫名的大”,实际上那多出来的部分就是CRT静态库。 静态链接(Static Linked DLL): 这里的静态链接指的是:动态库的静态链接方式。在编译动态库的时候,会生成一个对应的lib文件,这个文件是动态lib,里面存放着动态库中的导出声明,将其链接到目标文件中,再添加上相应的头文件,就可以使用dll中的接口了。 动态链接(Dynamic Linked DLL): 动态链接指的是动态加载和释放动态库,并动态调用dll中的接口。 有人会想,动态链接这样麻烦,为什么还要用呢?这里有一个技术问题,对这个问题的解决直接导致了动态加载的需求。问题是有些DLL只在某个Windows版本中存在,或某个API只在某些Windows版本中被加入指定的DLL。当你使用静态链接的.exe试图在不支持的Windows版本上运行时,系统会弹出系统对话框提示某某.dll无法加载或无法定位某某API的消息,然后就中止.exe的运行。像这样因为个别功能的实现依赖于某个DLL,当这个DLL不可用时导致整个.exe无法运行是不明智的。避免这样的结局只有用动态链接。 还有,C#或其他语言在调用C++动态库的时候也只能动态加载。 |