ubuntu共享库.so文件路径设置 error while loading shared libraries

默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定–prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。

1、首先打开/etc/ld.so.conf文件

2、加入动态库文件所在的目录:执行vi /etc/ld.so.conf,在"include ld.so.conf.d/*.conf"下方增加"/usr/local/lib"。

3、保存后,在命令行终端执行:/sbin/ldconfig -v;其作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。

经过以上三个步骤,"error while loading shared libraries"的问题通常情况下就可以解决了。

如果运行应用程序时,还是提示以上错误,那就得确认一下是不是当前用户在库目录下是不是没有可读的权限。像我遇到的问题就是,从别的机子拷贝了一些.so动态库,然后用root权限放到了/usr/local/lib中(普通用户没有对该目录的写权限),然后切换用户运行程序时,始终提示找不到.so库,一直以为是我配置有问题,结果是因为权限原因,那些我用root权限增加到/usr/local/lib中的.so文件对于普通用户而言,是没有访问权限的,所以以普通用户运行程序,当需要链接.so库时,在/usr/local/lib中是查找不到的。

其实,对于由普通用户自己编译生成的.so库文件,比较好的做法是将这些.so库文件的路径用export指令加入到/.bash_profile中的LD_LIBRARY_PATH变量中,LD_LIBRARY_PATH是程序运行需要链接.so库时会去查找的一个目录,/.bash_profile是登陆或打开shell时会读取的文件,这样,每次用户登录时,都会把这些.so库文件的路径写入LD_LIBRARY_PATH,这样就可以正常地使用这些.so库文件了。

Linux安装时可能要修改的配置文件:/etc/profile、/etc/bashrc(ubuntu没有这个文件,对应地,其有/etc/bash.bashrc文件。我用的是ubuntu系统,所以下面将一律使用/etc/bash.bashrc来叙述)、/.bash_profile、/.bash_login、/.profile、/.bashrc。

我的ubuntu系统(版本为10.04)默认情况下,只有/etc/profile、/etc/bash.bahsrc、/.profile、/.bashrc这四个文件。其他文件可以创建。

这些文件的作用有很多,比如环境变量的设定、定制符合自己风格的shell、还可以设置缩写功能,那个ll命令是 ls –alF命令的缩写。

    相信大家最关心这些文件在安装软件时候的作用。为什么要配置这些文件?配置后,要不要重启Linux才能使得生效。 
    要弄清这些问题。首先要知道打开一个终端或者打开一个新shell时(注意,两者是不同的。比如在终端里输入bash,会进入一个新shell。此时并没有打开新终端),会读取到哪些文件。

    之所以是要配置这些文件,是因为这些软件要在环境变量中添加属于自己的信息,或者新建一个属于自己的环境变量(如安装JDK时要新建一个JAVA_HOME环境变量)。系统会根据环境变量里的值,找到软件的一些文件的路径。

/etc/profile、/etc/bash.bahsrc、/.profile、/.bashrc

让所有帐号从此都优先加载当前目录的动态库
修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
PS:修改ld.so.conf不能达到我们的目的,因为ld.so.conf只支持绝对路径。

windows的动态库搜索顺序,虽然有可能会造成潜在的混乱,但是对于开发和测试无疑是比较方便的,尤其是debug和release版本的动态库需要经常切换进行测试的时候。linux的动态库搜索顺序虽然可以说成是比较严谨,但是相对来说也比较呆板,有时候会造成不便。
ldd LB //查看进程依赖的动态库
其实,linux也可以支持“加载当前目录的动态库”。只要设置合适的环境变量LD_LIBRARY_PATH就可以了。设置方法有以下三种:
1、临时修改,log out之后就失效
在terminal中执行:export LD_LIBRARY_PATH=./
2、让当前帐号以后都优先加载当前目录的动态库
在Red Hat中修改~/.bash_profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
(而在ubuntu中要修改的文件的名称是~/.profile)
3、让所有帐号从此都优先加载当前目录的动态库
修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
PS:修改ld.so.conf不能达到我们的目的,因为ld.so.conf只支持绝对路径。

LD_LIBRARY_PATH=/home/maniac/lib
export LD_LIBRARY_PATH

重启,输入export查看定义信息
具体如下图所示,然后就可以正常链接到我们所需要的的库了
在这里插入图片描述

如果包含路径和链接路径代码版本不一样会出现如下问题

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值