目录
1.动态库和静态库的原理
2.动态库加载失败的原因
3.解决方法
3.1 DT_RPATH段
3.2将libcalc.so的路径加入到环境变量LD_LIBRARY_PATH中
3.3将libcalc.so的路径加入到/etc/ld.so.cache文件列表中
3.4将libcalc.so直接放到/lib/、/usr/lib目录中
1.动态库和静态库的原理
GCC进行链接时,会把静态库中的代码放到可执行程序中。但是对于动态库,不会把代码放到可执行程序中,只会把一些相关信息(如动态库的名字等)放到可执行程序中。运行的时候,如果用到了动态库中的内容,在可执行程序中是找不到的。导致错误出现。
注:执行时如果用到了动态库中的API,动态库会被加载到内存中。
2.动态库加载失败的原因
下面通过ldd命令查看main的动态库依赖关系:
可以看到列出了用到的4个动态库。
上面提到的动态载入器eld-linux.so即最后一个动态库。
因为动态载入器在DT_RPATH段、环境变量LD_LIBRARY_PATH等中找不到libcalc.so的绝对路径,所以会报错。
3.解决方法
将libcalc.so的路径加入到DT_RPATH段、LD_LIBRARY_PATH、/etc/ld.so.cache文件列表或者将libcalc.so直接放到/lib/、/usr/lib目录中
3.1 DT_RPATH段
DT_RPATH段我们改变不了,直接下一个。
3.2将libcalc.so的路径加入到环境变量LD_LIBRARY_PATH中
方式1:在终端直接加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wcj/projec/lesson4/library/lib
即先获取原来的环境变量,再在后面加上动态库的路径
但是该终端关闭后,值之前加的环境变量就失效了,打开新终端之后又得重新弄。
下面讲永久配置,分为两种方式:用户级别的配置和系统级别的配置
方式2:永久配置---用户级别
打开.bashrc文件:
(vi中,shift+G可以跳到最后一行,小写的o可以向下插入一行)
在最后一行插入:
保存之后,使修改生效:
第一个点相当于source,也可以写成“source .bashrc”
回到原来的目录,发现可以运行:
方式3:永久配置--系统级别
配置之前,先把上面配置的删掉。并重新打开一个终端,防止上一步潜在的影响。
打开/etc/profile文件:
在最后一行添加:
使修改生效:
回到原来的目录中,可以执行,如下图:
3.3将libcalc.so的路径加入到/etc/ld.so.cache文件列表中
先将上面的修改删除,再重新打开一个终端
先尝试打开/etc/ld.so.cache:
发现不能编辑,如下图:
既然不能直接修改这个文件,那就间接修改:
添加动态库的路径:
保存之后,更新:
回到原来的目录,可以执行,如下图:
3.4将libcalc.so直接放到/lib/、/usr/lib目录中
最后一种不建议使用。因为这两个目录中保存的是系统的库文件,防止对其误操作。
参考:牛客网 C++高薪求职项目《Linux高并发服务器开发》1.7/1.8动态库加载失败的原因和解决
专属优惠链接:
https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)