首页 > 编程语言(其他) > 动态库和静态库的区别

动态库和静态库的区别

标 签:
什么是库:
库通俗的说就是把这些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用。库是别人写好的现有的,成熟的,可以复用的代码,我们只需要知道其接口如何定义,便可以自如使用。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。比如我们常使用的printf函数,就是c标准库提供的函数。我们在使用时只需要包含相应的头文件就可以使用(非静态编译还要有相应的库文件)。而不用关心printf函数具体是如何实现的,这样就大大提高了程序员编写代码的效率。从使用方法上分库大体上可以分为两类:静态库和共享库。在windows中静态库是以.lib为后缀的文件,共享库是以.dll为后缀的文件。在Linux中静态库是以.a为后缀的文件,共享库是以.so为后缀的文件。
静态库和动态库在加载中的区别:
当程序与静态库连接时,源文件中所有引用的库函数所对应的目标文件和源文件的目标文件会一起链接起来生成可执行文件。这就会导致最终生成的可执行代码量相对变多,相当于编译器将代码补充完整了,这样运行起来相对就快些。不过会有个缺点:占用磁盘和内存空间.静态库会被添加到和它连接的每个程序中,而且这些程序运行时,都会被加载到内存中.无形中又多消耗了更多的内存空间.
与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有在程序执行时,那些需要的函数代码才被拷贝到内存中。这样就使可执行文件比较小,节省磁盘空间,更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用,也同时节约了内存。不过由于运行时要去链接库会花费一定的时间,执行速度相对会慢一些。
总的来说静态库是牺牲了空间效率,换取了时间效率,共享库是牺牲了时间效率换取了空间效率,没有好与坏的区别,只看具体需要了。

另外,.一个程序编好后,有时需要做一些修改和优化,如果我们要修改的刚好是库函数的话,在接口不变的前提下,使用共享库的程序只需要将共享库重新编译就可以了(增量更新),而使用静态库的程序则需要将静态库重新编译好后,将程序再重新编译一遍(全量更新)。

静态库和动态库的优缺点

我们通常把一些公用函数制作成函数库,供其它程序使用。
函数库分为静态库和动态库两种。
静态库在程序编译时会被连接到目标代码中(所以程序也会相对比较大
),但是程序运行时将不再需要该静态库,因此运行起来速度相对比较快。
动态库在程序编译时并不会被连接到目标代码中(所以程序相对比较小
),但是在程序运行是才被载入,因此在程序运行时还需要动态库存在。但是动态库不需要和程序链接起来,并且在内存中通过虚拟内存每个所需要的库只保存一份,所以大大减少了内存。
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
如何知道一个可执行程序依赖哪些库:

ldd命令可以查看一个可执行程序依赖的共享库
如:ldd 可执行文件名称
可执行程序在执行的时候如何定位共享库文件:
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。
-L:库的绝对路径
-l:绝对路径下库的名称(一般去掉前缀的lib和去掉后缀.so)
作者:poison_biti 发表于2017/8/7 19:33:43 原文链接
阅读:326 评论:0 查看评论
分类: 编程语言(其他) 标签: