静态库和动态库

The purpose of our lives is to give birth to the best which is within us.--------我们生活的目的是要孕育我们内在最好的东西.


用过python,你肯定import过很多库,然后直接调用库里各种函数就ok了,库体现了编程世界里模块化黑箱处理的思想,对于已经开发好的功能我们没必要重复书写,我们直接调用库,大大提高了开发的效率,也铸造现在蓬勃的生态。

另外,如果想要让客户使用代码的功能,又不想让别人看到自己的源码,就可以把自己的源码打包制作成库。

那到底什么是库呢?

1, 什么是库?

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。

库是别人写好的,现有的,成熟的,可以复用的代码,你可以使用但要 必须得遵守许可协议。

Linux操作系统支持的函数库分为静态库动态库,动态库又称共享库。

Linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib
在这里插入图片描述

2, 静态链接库

名称 = lib+xxx+.a

例如libhello.a

优点
编译后的执行程序不需要外部的函数库支持

缺点

上面的优点也是他的缺点
因为所有使用的函数都已经被编译进可执行文件了。当然这也会称为它的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大

  • 其实我们很少使用静态库,另外gcc编译的默认也是动态链接。
  • 如果动态库和静态库同时存在时,链接器优先使用动态库

3, 动态链接库(共享库)

动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。

在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。

3.1 名称

名称 = lib+xxx+.so

例如 libxxx.so

动态链接库的名称有别名(soname), 真名(realname)和链接名(linker name)。上面的例子就是别名。

真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。

除此之外,还有一个链接名,即程序链接时使用的库的名字。

动态库又称共享库;

3.2 优点:

  • 相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。

  • 动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减少应用程序的体积。

3.3 缺点:

  • 由于函数库没有被整合进你的程序,而是程序运行时动态申请并调用,所以程序的运行环境中必须提供相应的库。

4, 静态库和动态库区别

静态库动态库
命名方式libxxx.alinux下后缀名 libxxx.so;windows 下后缀名libxxx.dll
链接时间静态库的代码是在编译过程中被载入程序中。程序执行到相关函数时才调用该函数库里的相应函 数。
链接方式静态库的链接是将整个函数库的所有数据都整合进了目标代码。动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函 数。
适用情况静态库较适宜于较小的应用程序,因为它们只需要最小限度的函数。每一个运行的程序都要有一份库的副本。而对于需要多个库的应用程序来说,则适合使用共享库,因为它们可以减少应用程序对内存(包括运行时中的磁盘占用和内存占用)的占用。这是因为多个应用程序可以同时使用一个共享库;因此,每次只需要在内存上复制一个库。
优点编译后的执行程序不在需要外 部的函数库支持动态库的改变并不影响 你的程序,所以动态函数库升级比较方便。
缺点1,如果所使用的静态库发生更新改变,你的程序必须重新 编译。2,目标文件大1,函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。

相同点:不管是静态函数库还是动态函数库,都是由*.o目标文件生成。

为什么我们优先使用动态库?
静态链接所生成的文 件所占用的内存要远远大于动态链接所生成的文件。这是因为静态链接是在编译时将所有的函数都编译进了程序,而动态链接是 在程序运行时由操作系统帮忙把动态库调入到内存空间中使用。

另外我会给出如何制作静态库或者动态库以及如何使用博客的地址:
https://blog.csdn.net/weixin_46027505/article/details/105223248

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值