动态链接库和静态链接库一般是编译集成一系列的接口(函数)
在程序源代码编译完成后通过编译器编译并通过链接器与这些库进行链接
动态链接库与静态链接库的区别在于链接器在进行链接时静态库会被直接编译进程序里
而动态链接库并不会,我们这里将这些链接库称作依赖(动态库和静态库)
程序的运行需要这些依赖,程序在静态链接后该程序本身便已包含该依赖
而动态链接后的程序本身本不包含该依赖,这些依赖需要执行者自行安装进操作系统(动态库、运行时库)
程序运行时会动态地加载这些库
linux上动态库一般的后缀后为.so
静态库一般的后缀为.a
由于静态链接会直接将库编译进程序里所以静态编译后的程序相较于动态链接所要大
这就是因为静态链接会将链接库编译进程序里的原因,所以占用就要大了
出于这种原因,静态库不易于维护与更新,如果链接库中有实现有bug等需要更新则需要更新整个程序,因为静态库被编译进程序中了
但动态库就没有这种情况了,因为动态库是程序运行时动态加载的,所以我们只需要更新动态库而不需要更新所有依赖该库的程序(软件)
另一方面,很多程序的开发都会使用到相同的链接库,也就是很多程序(软件)会有相同的依赖
如果将这些依赖全部静态编译的话将会造成存储资源占用过多而造成资源浪费
而使用动态库的方式这些程序(软件)则可以共享一个链接库,而不需要每个程序都带一个链接库,这样就大大地减少了存储资源占用空间
静态库:
可以把它想象成是一些代码的集合,在可执行程序运行前就已经加到了代码中,成为了执行程序的一部分,一般是以.a为后缀的文件名,Windows下后缀为.lib。静态库的命名也分为三部分,1、前缀:lib,2、库的名称:随意,如lisi,3、后缀:.a。
优点:1、在最后,函数库是被打包到应用程序中的,实现函数本地化、寻址方便、高效。2、程序在运行的时候,与函数库没有关系,移植性更强。
缺点:1、消耗资源较大,每个进程在使用静态库的时候,都要复制一份才可以,这也就造成了内存的消耗。2、在程序更新、部署、发布的时候,使用静态库相对麻烦,如果一个静态库更新了,那它的应用程序都需要重新编译,再发送给用户,有的时候可能只是一个小的改动,但对于用户来说,会导致整个程序重新下载。
动态库:
在程序编译时不会被连接到目标代码中,在后期运行时才会载入,不同的应用程序如果调用相同的库,内存中只有一份共享库的拷贝,也就避免了空间的浪费问题。一般以.so作为文件后缀名,也分为三部分:1、前缀:lib,2、库名称:自定义,3、后缀:.so
优点:1、节省内存2、部署、升级相对方便,只需要更换动态库,再重新启动服务即可。
缺点:1、加载速度比静态库慢2、移植性较差,需要把所有用到的动态库进行移植。
根据链接时期的不同,库又有:静态库和共享库(动态库)
二者的不同点在于代码被载入的时刻不同
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。