Linux 动态库的制作与使用

122 阅读2分钟

动态库的制作和使用

在这里插入图片描述

原始结构如下: 在这里插入图片描述

先进入calc文件,并生成与位置无关的.o文件 在这里插入图片描述

接着生成动态文件库,使用ll指令可以看到,库名为绿色,linux中绿色的文件一般都是可执行文件 在这里插入图片描述

将其生成的libcalc.so文件拷贝到lib文件下 在这里插入图片描述

生成main可执行文件 在这里插入图片描述

当尝试执行时,报错,无法找到动态库文件 在这里插入图片描述

为什么会这样呢?因为运行的时候,动态库未被加载到内存中,导致可执行文件main在运行时无法找到该动态库 在这里插入图片描述

通过ldd命令查看可执行文件main的动态依赖库,发现自己写的动态依赖库libcalc.so未被找到 在这里插入图片描述

此时需要系统的动态载入器(ld-linux.so)动态加载, 现在来解决这个问题 在这里插入图片描述


(该方法一关闭终端就会失效,仅作学习用途) DT_RPATH段是没办法改变的,所以尝试在环境变量LD_LIBRARY_PATH中加载所使用的动态库的绝对路径

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/Linux/lession06/library/lib

向环境变量LD_LIBRARY_PATH中添加动态库的绝对路径

使用echo可以看到,该动态库的绝对路径已经被成功的加载到了环境变量中。最后执行成功。


怎么样永久解决这个问题呢?两种方法,一是用户级别的配置: 在这里插入图片描述

在这里插入图片描述

配置完并保存退出后,需要使配置生效,下面两行命令都可以,是同样的意思,选一种即可 在这里插入图片描述

这个就是用户级别的配置, 在这里插入图片描述

第二种方法就是进行系统配置

在该系统文件中进行配置 在这里插入图片描述

同样在该文件的最后一行输入:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/Linux/lession06/library/lib

在这里插入图片描述

保存退出后使用source命令使该配置生效 在这里插入图片描述

最后可以看到,可以找到动态库的位置了 在这里插入图片描述


上面介绍了改环境变量从而解决动态库加载失败的两种方法,下面来介绍改/etc/ld.so.cache

因为/etc/ld.so.cache文件里的内容均为二进制文件,所以需要别的方法

首先在/etc/ld.so.conf文件中加入动态库的绝对路径/root/Linux/lession06/library/lib 在这里插入图片描述

再输入下图中的该指令 在这里插入图片描述

同样可以解决问题 在这里插入图片描述


最后一种解决方法就是把动态库文件放到/lib/,或者/usr/lib目录内,也能解决问题(这种方式不建议使用,这两个目录内有很多文件,可能会库文件重名导致出现问题)