动态库和静态库的特性

11345863-6fab6d97a731bec8.jpg
001.jpg

大师兄镇楼。O(∩_∩)O哈哈~

什么是库

库是共享程序代码的方式,一般分为静态库(static libraries)、动态库(dynamically loaded libraries)和共享库(shared libraries)。

静态库

静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀。

静态函数库,是在程序执行前就加入到目标程序中去了 。

静态库的后缀是.a,它的产生分两步(linux下)

  • 由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表
  • ar命令将很多.o转换成.a,成文静态库

Android中需要设定Android.mk文件。

动态库

动态库是在当一个可执行程序在启动的时候被加载。

在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll。

每个动态库都有个特殊的名字,称作“soname”。soname名字命名必须以“lib”作为前缀,然后是函数库的名字,然后是“.so”,最后是版本号信息。

动态库库文件必须放在一些特定的目录里,这样通过系统的环境变量设置,应用程序才能正确的使用这些函数库。

优缺点

静态库的优点

(1) 代码装载速度快,执行速度略比动态链接库快;
(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免so地狱等问题。

动态库的优点

(1) 更加节省内存并减少页面交换;
(2) so文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换so文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个so函数;
(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

缺点

(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
(2) 使用动态链接库的应用程序不是自完备的,它依赖的so模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于so中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。

使用

静态链接

静态库使用静态链接的方法。

动态库也可以使用静态链接。

动态库使用静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来。

动态链接

动态链接方法,只有动态库使用。

使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。

猜你喜欢

转载自blog.csdn.net/weixin_33892359/article/details/87449852
今日推荐