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.a | linux下后缀名 libxxx.so;windows 下后缀名libxxx.dll |
链接时间 | 静态库的代码是在编译过程中被载入程序中。 | 程序执行到相关函数时才调用该函数库里的相应函 数。 |
链接方式 | 静态库的链接是将整个函数库的所有数据都整合进了目标代码。 | 动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函 数。 |
适用情况 | 静态库较适宜于较小的应用程序,因为它们只需要最小限度的函数。每一个运行的程序都要有一份库的副本。 | 而对于需要多个库的应用程序来说,则适合使用共享库,因为它们可以减少应用程序对内存(包括运行时中的磁盘占用和内存占用)的占用。这是因为多个应用程序可以同时使用一个共享库;因此,每次只需要在内存上复制一个库。 |
优点 | 编译后的执行程序不在需要外 部的函数库支持 | 动态库的改变并不影响 你的程序,所以动态函数库升级比较方便。 |
缺点 | 1,如果所使用的静态库发生更新改变,你的程序必须重新 编译。2,目标文件大 | 1,函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。 |
相同点
:不管是静态函数库还是动态函数库,都是由*.o目标文件生成。
为什么我们优先使用动态库?
静态链接所生成的文 件所占用的内存要远远大于动态链接所生成的文件。这是因为静态链接是在编译时将所有的函数都编译进了程序,而动态链接是 在程序运行时由操作系统帮忙把动态库调入到内存空间中使用。
另外我会给出如何制作静态库或者动态库以及如何使用博客的地址:
https://blog.csdn.net/weixin_46027505/article/details/105223248