现在的位置: 首页 > 综合 > 正文

动态与静态库

2018年01月25日 ⁄ 综合 ⁄ 共 1294字 ⁄ 字号 评论关闭

动态与静态函式库

首先我们要知道的是,函式库的类型有哪些?依据函式库被使用的类型而分为两大类,分别是静态 (Static) 与动态 (Dynamic) 函式库两类。底下我们来谈一谈这两种类行的函式库吧!


  • 静态函式库的特色:
  • 扩展名:(扩展名为 .a)
    这类的函式库通常扩展名为 libxxx.a 的类型;

  • 编译行为
    这类函式库在编译的时候会直接整合到运行程序当中,所以利用静态函式库编译成的文件会比较大一些喔

  • 独立运行的状态
    这类函式库最大的优点,就是编译成功的可运行档可以独立运行,而不需要再向外部要求读取函式库的内容 (请参照动态函式库的说明)。

  • 升级难易度
    虽然运行档可以独立运行,但因为函式库是直接整合到运行档中,因此若函式库升级时,整个运行档必须要重新编译才能将新版的函式库整合到程序当中。也就是说,在升级方面,只要函式库升级了,所有将此函式库纳入的程序都需要重新编译!


  • 动态函式库的特色:
  • 扩展名:(扩展名为 .so)
    这类函式库通常扩展名为 libxxx.so的类型;

  • 编译行为
    动态函式库与静态函式库的编译行为差异挺大的。与静态函式库被整个捉到程序中不同的,动态函式库在编译的时候,在程序里面只有一个『指向(Pointer)』的位置而已。也就是说,动态函式库的内容并没有被整合到运行档当中,而是当运行档要使用到函式库的机制时,程序才会去读取函式库来使用。由於运行档当中仅具有指向动态函式库所在的指标而已,并不包含函式库的内容,所以他的文件会比较小一点

  • 独立运行的状态
    这类型的函式库所编译出来的程序不能被独立运行,因为当我们使用到函式库的机制时,程序才会去读取函式库,所以函式库文件『必须要存在』才行,而且,函式库的『所在目录也不能改变』,因为我们的可运行档里面仅有『指标』亦即当要取用该动态函式库时,程序会主动去某个路径下读取,呵呵!所以动态函式库可不能随意移动或删除,会影响很多相依的程序软件喔!

  • 升级难易度
    虽然这类型的运行档无法独立运行,然而由於是具有指向的功能,所以,当函式库升级后,运行档根本不需要进行重新编译的行为,因为运行档会直接指向新的函式库文件(前提是函式库新旧版本的档名相同喔!)。

目前的 Linux distribution 比较倾向於使用动态函式库,因为如同上面提到的最重要的一点,就是函式库的升级方便!由於 Linux 系统里面的软件相依性太复杂了,如果使用太多的静态函式库,那么升级某一个函式库时,都会对整个系统造成很大的冲击!因为其他相依的运行档也要同时重新编译啊!这个时候动态函式库可就有用多了,因为只要动态函式库升级就好,其他的软件根本无须变动。

那么这些函式库放置在哪里呢?绝大多数的函式库都放置在:/usr/lib, /lib 目录下!此外,Linux 系统里面很多的函式库其实 kernel 就提供了,那么 kernel 的函式库放在哪里?呵呵!就是在/lib/modules 里面啦!里面的数据可多著呢!不过要注意的是,不同版本的核心提供的函式库差异性是挺大的,所以kernel 2.4.xx 版本的系统不要想将核心换成 2.6.xx
喔!很容易由於函式库的不同而导致很多原本可以运行的软件无法顺利运行呢

抱歉!评论已关闭.