前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态库和静态库的特性

动态库和静态库的特性

作者头像
李小白是一只喵
发布2020-04-23 16:02:54
1.8K0
发布2020-04-23 16:02:54
举报
文章被收录于专栏:算法微时光算法微时光

什么是库

库是共享程序代码的方式,一般分为静态库(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中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。

使用

静态链接

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

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

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

动态链接

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是库
    • 静态库
      • 动态库
      • 优缺点
        • 静态库的优点
          • 动态库的优点
            • 缺点
            • 使用
              • 静态链接
                • 动态链接
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档