首页 > 代码库 > 对动态库和静态库的一些总结

对动态库和静态库的一些总结

动态库和静态库

区 别

静态库

动态库

    将库文件中的二进制代码直接链接到目标文件,程序运行时不再需要库;

    将接口在库文件中的位置信息链接到目标文件,程序运行时再根据这些位置信息进行调用,因此运行时需要库文件;

    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++动态库的时候也只能动态加载。

 

对动态库和静态库的一些总结