目录
- 动态库的制作和使用
动态库的制作和使用
原始结构如下:
先进入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目录内,也能解决问题(这种方式不建议使用,这两个目录内有很多文件,可能会库文件重名导致出现问题)