gcc制作动态库加载提示“./main: error while loading shared libraries: libcals.so: cannot open shared object fi”

通过gcc制作动态库完成之后,并生成程序的可执行文件之后。若直接运行,会报错“./main: error while loading shared libraries: libcals.so: cannot open shared object file: No such file or directory”。如图所示。
在这里插入图片描述
这里先放出动态库加载失败的原因:
静态库和动态库的区别在于,前者GCC进行链接时,会把静态库中代码打包到可执行程序中;后者GCC进行链接时,动态库的代码不会被打包到可执行程序中。
当程序启动之后,动态库会被动态加载到内存中,通过命令$ ldd xxx检查动态库的依赖关系。
在这里插入图片描述
到这里就可以知道,因为动态库没有被加载到内存中,所以才导致运行会出错。
注:其中xxx为可执行程序,ldd(list dynamic dependencies)

那么,如何定位共享库文件呢?
当系统加载可执行代码时,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。
对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段 ——> 环境变量 LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/或者/usr/lib目录找到库文件后将其载入内存。

解决动态库加载失败问题:
配置其对应的环境变量,使其能找到自己所对应的库文件,命令如下:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/jin/Linux/dynamiclib_test/library/lib
注:后面的路径为动态库存放的路径,可以先cd到对应的文件夹,然后使用命令pwd输出当前的目录

在这里插入图片描述
添加环境变量完成以后,在ldd下,发现,找不到的动态库文件可以找到了,如图所示。
在这里插入图片描述

此时,我们再执行下这个可执行程序,可以发现,可以正常运行了。
在这里插入图片描述

是不是很开心,问题解决了。 然鹅,当你关掉了再打开终端继续运行,你就会发现,又出现和刚才一样的问题了。因为刚刚那个只是临时的,我们需要配置一个永久的环境变量。
这里分为用户级别和系统级别的配置方法,分别如下所示。
1、用户级别配置
step1:进入home目录,命令$ cd ~
step2:$vim .bashrc
step3:shift+g至文件最后 ——》 i ,将环境配置语句添加进去

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/jin/Linux/dynamiclib_test/library/lib

step4:esc ——》:wq! 保存并退出,$ . ./.bashrc 使之生效。再到指定目录运行即可。

2、系统级别配置
类似于方法一
step1:$ sudo vim /etc/profile
step2:在最后添加环境变量,并保存退出
step3:$. /etc/profile

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值