Linux中静态库和动态库(共享库)的区别

1. 静态库和动态库的制作过程区别

1.1 静态库的制作过程

在这里插入图片描述

详见博客:Linux中静态库的制作与使用

1.2 动态库的制作过程

在这里插入图片描述

详见博客:Linux中动态库(共享库)的制作与使用

2. 静态库和动态库在程序编译时使用它们的共同点和区别

在这里插入图片描述
共同点:
如果在程序中使用到了静态库和动态库,那么静态库和动态库都是在程序的链接阶段进行处理。

区别:

  1. 静态库:程序在链接阶段,会将静态库的代码复制到可执行程序中。在可执行程序运行时,直接调用静态库中的代码。
  2. 动态库:程序在链接阶段,没有将动态库的代码复制到可执行程序中,仅仅将动态库的一些信息(例如动态库的名称)复制到可执行程序中。在可执行程序运行时,由系统将动态库的代码动态加载到内存中供程序调用。

3. 静态库和动态库的优缺点

3.1 静态库的优缺点

优点:

  • 静态库被打包到可执行程序中,因此加载速度快。
  • 发布程序时,无序提供静态库,因此移植方便。

缺点:

  • 消耗系统资源、浪费内存。
    比如程序A和程序B的源代码都用到了静态库libdemo.a,那么在程序A和程序B的源代码进行链接的时候,静态库libdemo.a就已经被复制进程序A和程序B中了,相当于复制了两份。计算机在同时运行程序A和程序B的可执行程序时,程序A和程序B中由于各自存在一个静态库libdemo.a,因此内存中也同时有两个静态库libdemo.a在运行着,浪费内存。
  • 更新、部署、发布麻烦。
    当静态库libdemo.a的内容更新时,需要把更新后的静态库以及对应的头文件发送给用户,然后用户使用新的静态库及头文件,对原来的程序进行重新链接(程序在链接阶段,会将静态库的代码复制到可执行程序中。因为静态库更新了,所以程序也要重新链接),最后才能使用。

3.2 动态库的优缺点

优点:

  • 可以实现进程间资源共享。
    比如程序A的可执行程序在运行时用到了动态库libdemo.so,那么系统会将动态库的代码动态加载到内存中,此时若有其他正在执行的程序也需要用到动态库libdemo.so中的代码,则不需要再次加载动态库,可以与程序A共享动态库libdemo.so。
  • 更新部署发布简单。
    当动态库libdemo.so的内容更新时,只需重新编译生成新的动态库,然后把新的动态库及对应的头文件分发给用户,用户就可以直接使用了,不需要对使用动态库的程序重新编译链接(因为程序在链接阶段,没有将动态库的代码复制到可执行程序中,仅仅将动态库的一些信息(例如动态库的名称)复制到可执行程序中)。
  • 可以控制何时加载动态库。

缺点:

  • 加载速度比静态库慢。
  • 发布程序时需要提供依赖的动态库。

在这里插入图片描述

4. 何时使用静态库与何时使用动态库

一般情况下,如果库的体积较小,建议使用静态库,如果库的体积比较大,建议使用动态库。

猜你喜欢

转载自blog.csdn.net/mahoon411/article/details/113633138