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. 何时使用静态库与何时使用动态库

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

Linux中静态库和动态库(共享库)的区别相关推荐

  1. web中静态资源和动态资源的概念及区别

    1.静态资源和动态资源的概念 简单来说: 静态资源:一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件,返回给客户端,客户端解析并渲染显示出来. 动态资源:一般客户端请求的动态资源, ...

  2. Linux下的静态库、动态库和动态加载库

    from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...

  3. XCTF-攻防世界CTF平台-Reverse逆向类——56、tar-tar-binks(Mac平台下的64位动态链接共享库.dylib逆向)

    目录标题 一.解压缩 二.查看文件 三.分析程序 四.程序主要逻辑: 五.逆向思路: 步骤一: 步骤二: 六.解密代码: 题目提供了两个文件flag.tar和libarchive.dylib 一.解压 ...

  4. linux中进程退出函数:exit()和_exit()的区别

    linux中进程退出函数:exit()和_exit()的区别 (1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核. (2)调用_exit函数时,其会关闭 ...

  5. linux挂载到哪个分区,Linux中直接挂载硬盘和挂载分区有什么区别?

     1.问题 Linux中直接挂载硬盘和挂载分区有什么区别? 比如 /dev/sdb 的硬盘,直接mkfs.ext4 /dev/sdb 后mount 使用, 和 先fdisk 分区 ,在 mkfs ...

  6. Linux 中 which、whereis、locate、find的区别

    Linux 中 which.whereis.locate.find的区别 which whereis locate find 总结 which which [-a] cmdname1 cmdname2 ...

  7. dlopen动态装载共享库

    原文链接: http://www.ccccxy.top/coding/archives/2020/10/01/dlopen_load_shared_library_11/ 欢迎大神们评论指导和斧正 一 ...

  8. linux中从内存解析xml格式的库,Linux下使用libxml库解析xml文件

    目录 libxml简介 libxml库安装 libxml2中的数据类型和函数 xml文档解析实例 运行结果 libxml简介 libxml是一个用于解析xml文件的库,在各个平台下都能使用,也支持多种 ...

  9. 关于C++中静态多态性和动态多态性的理解

    1. 什么是多态性 1.0多态的简要介绍:多态中的态为形态的意思,在面向对象编程中是指向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为.举个例子通俗来讲就是:比如说开学了,校长把这个消息 ...

最新文章

  1. viewpage的使用
  2. Qt小传——从诞生到发展、繁荣
  3. 关于Ueditor存储在mysqlUTF-8乱码的问题
  4. 二叉树的三叉链表存储和基本操作
  5. mysql 403_mysql数据库管理phpmyadmin 403错误的解决方法
  6. 20200927:Java和Cpp中栈与队列的区别
  7. HyperLedger Fabric 1.0的Transaction处理流程
  8. css matrix矩阵,矩阵 | matrix() (Transforms) - CSS 中文开发手册 - Break易站
  9. 图像的缩放,旋转,转置和镜像
  10. Java内部类访问局部变量时的final问题
  11. POJ 3278(Catch That Cow)
  12. 陈希孺《概率论与数理统计》读书笔记
  13. PLSQL设置字体大小
  14. 自定义View之Layout方法详解
  15. c语言指数公式_用C语言求幂函数和指数函数的方法
  16. 腾讯视频过滤广告简略办法
  17. 单链表的十三个基本操作(全)
  18. 精英A785主板在bios中设置u盘启动教程
  19. 微信小程序如何在后端获取openId?
  20. 一分钟知道屏幕分辨率、尺寸、PPI之间的关系!!!

热门文章

  1. ThinkPhp6+Vue大数据分析后台管理系统
  2. 【C语言】冒泡排序学习笔记
  3. 【AI学习总结】均方误差(Mean Square Error,MSE)与交叉熵(Cross Entropy,CE)损失函数
  4. 动态规划----最长子序列
  5. java程序员拜年代码_作为一个资深的程序员我们应该这么拜年
  6. 嵌入式系统之ucLinux与uc/os-II的比较
  7. yolo3训练人脸检测模型
  8. JavaWeb开发 —— Ajax
  9. Java 中 Boolean 和 boolean的默认值和修改默认值
  10. MySQL数据库中插入图片