动态库的制作及使用

动态库的制作

命名规则:
Linux:lib***.so
lib:前缀(固定)
***:库的名字,自己起
.so:后缀(固定)
在Linux下是一个可执行文件
Windows:lib—.dll
动态库的制作

  • gcc得到.o文件,得到和位置无关的代码
    gcc -c -fpic/-fPIC a.c b.c
  • gcc得到动态库
    gcc -shared a.o b.o -o libcalc.so

动态库加载失败原因
在这里插入图片描述

工作原理

  • 静态库:GCC进行链接时,会把静态库中代码打包到可执行程序中
  • 动态库:GCC进行链接时,动态库的代码不会被打包到可执行程序中
  • 程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系
  • 如何定位共享库文件呢?
    当系统加载可执行代码的时候,能够知道其依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so完成,它先后搜索elf文件的DT_RPATH段->环境变量LD_LIBRART_PATH->/etc/ld.so.cache文件列表->/lib/,/usr/lib目录找到库文件后将其载入内存。
    在这里插入图片描述

解决动态库加载失败问题

方法一:配置环境变量,在终端中配置,只是临时的,永久级别配置需要用户级别和系统级别配置
在这里插入图片描述
在这里插入图片描述
方法二:环境变量,用户修改
vim界面中:shift+G-到最后一行,O向下插入一行,Esc+:wq,保存并退出
Esc+dd:删除选中的某一行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法三:环境变量,系统修改
在这里插入图片描述
方法四:/etc/ld.so.cache文件列表
sudo vim /etc/ld.so.conf 将lib目录复制进该文件;sudo ldconfig更新文件配置;
在这里插入图片描述
方法五:/lib/,/usr/lib目录,不推荐使用!本身包括许多系统自身的库文件,防止误操作,重名!

静态库和动态库的对比

程序编译成可执行程序的过程
在这里插入图片描述
静态库制作过程
在这里插入图片描述
动态库制作过程
在这里插入图片描述
库非常小时,建议用静态库;库非常大时,建议用动态库
静态库的优缺点
优点

  • 静态库被打包到应用程序中加载速度快
  • 发布程序无需提供静态库,移植方便

缺点

  • 消耗系统资源,浪费内存
  • 更新、部署、发布麻烦

在这里插入图片描述

动态库的优缺点

优点

  • 可以实现进程间资源共享(共享库)
  • 更新、部署、发布简单
  • 可以控制何时加载动态库

缺点:

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值