动态链接库|面试 | Linux 下的动态链接库问题
文章插图
在 Linux 开发时 , 我们经常会看到一些形如 xxx.so 的名称出现 , 其中 so 是 Shared Object 的缩写 , 即可以共享的目标文件 , 也就是我们所称为的动态链接库 , 和在 Windows 下大家玩游戏时遇到的 xxx.dll 错误中的文件是一个类型的 。
文章插图
面试中经常会问到以下问题:
- 怎么创建一个动态库?
- 动态库文件的后缀名是什么?
- 怎么使用一个动态库?
- 动态库的命名规范?
- 系统默认的动态库的查找路径?
- 动态库显示连接所使用的系统库是什么?
库有两种:
- 静态库(.a、.lib)
- 动态库(.so、.dll)
文章插图
动态库和静态库的区别
左图为静态链接库 , 右图为动态链接库
文章插图
对于静态链接库而言在链接阶段 , 会将汇编生成的「目标文件.o」与引用到的库一起链接打包到可执行文件中 。 因此对应的链接方式称为静态链接:
- 静态链接库对函数库的链接是放在编译时期完成的 。 程序在运行时与函数库就没有了任何的联系 。
- 它比较浪费空间和资源 , 因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件 。
- 静态库对程序的更新和发布也会带来麻烦 。 如果静态库更新了 , 所有使用它的应用程序都需要重新编译、部署、发布给用户 。
- 不同的应用程序如果调用相同的库 , 那么在内存里只需要有一份该共享库的实例 , 可以实现进程之间的资源共享 。 (因此动态库也称为共享库)规避了空间浪费问题 。
- 动态库在程序运行时才被载入 , 也解决了静态库对程序的更新、部署和发布带来的麻烦 。 用户只需要更新动态库即可将一些程序升级变得简单 , 增量更新 。
文章插图
在 Linux 下一个动态库有y三个不同名字的文件组成:
- soname 文件
- lib + 链接库名字 + .so + .版本号
- real name 文件
- lib + 链接库名字 + .so + .版本号.次版本号.发行号
- linker name 文件
- lib + 链接库名字 + .so
二、创建一个动态库有了上面关于库的一些基础知识之后 , 我们可以开始尝试创建一个动态库来供程序使用了 。
比如我们有一个求最大值的函数 max(int a,int b,int c), 放在文件 max.c 中文件内容如下:
文章插图
可以通过:
文章插图
将其编译为共享库 , -fPIC是编译选项 , PIC是 Position Independent Code 的缩写 , 表示要生成位置无关的代码 , 这是动态库需要的特性; -shared是链接选项 , 告诉 gcc 生成动态库而不是可执行文件 。 为了让用户知道我们的动态库中有哪些接口可用 , 我们需要编写对应的头文件 , 比如可以写一个 max.h :
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 覆盖|iPhone13Pro概念机:机身正面被屏幕全覆盖,库克想搞事情?
- 不坑|库克不讲“性价比”!一台iPhone12至少赚4千,网友:不坑穷人
- 核酸|北京:所有入市交易冷链产品做到不验核酸不入库
- 唤醒|唤醒沉睡的立体车库
- 周娟|梅赛德斯-奔驰周娟:最大化利用品牌资产与客户建立品牌链接
- 优衣|一炮走红的“优衣库”,不但线上店铺常卖空,线下门店数也超日本
- 什么是“锚文本”?如何制作锚文本链接?
- Java安全之Javassist动态编程
- 巨杉亮相 DTCC2019,引领分布式数据库未来发展