Linux下无法使用动态链接库的解决方法

本次实验平台:
【Debian9】
gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
GNU ld (GNU Binutils for Debian) 2.28

最近在使用C语言造轮子,夯实基础。将常用算法封装成函数放入库中,供可执行程序调用。这里首先试验了静态链接,无问题。试验使用动态链接时,出现无法找到文件的错误。

参考项目:https://github.com/lienze/PlanC

以参考项目为例,代码可通过编译及链接,但在执行时,提示如下:
./TestString: error while loading shared libraries: libPlanC.so: cannot open shared object file: No such file or directory
说明程序无法找到正确的动态库。
此时使用系统提供的ldd脚本,查看共享库的依赖关系,如下图所示,提示无法找到libPlanC.so
在这里插入图片描述
再用readelf查看可执行程序的动态段,如下:
在这里插入图片描述
此处注册了libPlanC.so动态库,但是并没有指定查找目录,那么在运行此可执行文件时,系统只会在默认的路径查找libPlanC.so库,显然是找不到的。那么问题至此已经明确,解决方法只需要在链接阶段,设置链接器搜索指定目录,就可以正常运行。

在makefile中,加入如下指令:

-Wl,-rpath=../../src

编译以后,再次使用readelf查看可执行程序的动态段,如下:
在这里插入图片描述
可见Library runpath中指定了搜索目录。
再次使用脚本ldd查看依赖关系,如下:
在这里插入图片描述
至此,问题解决。

参考资料
1.https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/
2.man ld

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值