静态链接库 VS 动态链接库

来源:互联网 发布:谷阿莫华尔街之狼 知乎 编辑:程序博客网 时间:2024/04/28 15:49

动态链接共享库与静态链接库 比较
静态链接库的优点(.a/.lib)
代码装载速度快,指定速度略比动态链接库快只需要保证在开发者计算机中有正确的.LIB 文件,在以二进制形式发布程序时,不需要考虑在用户计算机上.LIB文件是否存在及版本问题,可避免DLL hell 等问题
静态库对函数库的链接是放在编译时期完成的。
程序在运行时与函数库再无瓜葛,移植方便

静态库的明显缺点: 1.需要定期的维护和更新,如果程序员想要使用一个库的最新版本,需要以显式的将他们的程序与更新了的库重新连接
2. 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件.

动态链接库的优点(.so/.dll)
更加节省内存并减少页面交换:
DLL文件与EXE文件独立,只要输出接口不变(即名称,参数,返回值类型,调用约定不变) 更换DLL文件不会 对EXE文件造成任何影响,因而极大提高了可维护型和可扩展性。

动态链接库和静态链接库的不同点。

二者的不同点在于代码被载入的时刻不同。

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小。

动态库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。带来好处的同时,也会有问题!如经典的DLL Hell问题。

DLL Hell的意思就是因为系统文件被覆盖而让整个系统像是掉进了地狱。

动态链接库的特点与优势
首先我们可以看到,把库函数推迟到程序运行时期载入的好处:
可以实现进程之间的资源共享(共享代码段)
什么概念呢? 就是说,某个程序在运行中需要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有了此库函数的拷贝。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。

将一些程序升级变得简单,用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是很好的例子。
甚至可以真正做到链接载入完全由程序员在程序代码中控制。
程序员在编写程序的时候,可以明确的指明什么时候,或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是开始就将所有的读写函数都载入,然后才发现在整个程序中根本没有用到他们。

0 0