我们在linux执行可执行程序的时候,有时候会遇到错误提示找不到相应的动态链接库,一般这有两种情况,一个是没有安装相应的动态链接库;还有一种就是安装了相关的动态链接库,但是系统按照默认的共享库路径找不到该动态链接库
1. 动态库已经安装到系统的默认共享库路径 /lib或者 /usr/lib下
如果共享库已经安装到/lib或者/usr/lib下面,那么只要执行下命令 ldconfig就行了
ldconfig命令的作用在于(该执行程序放在 /sbin目录下):
在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib.so),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表
2. 动态库安装到非默认共享库路径(比如/usr/local/lib或者用户自定义的路径)
如果所需要的动态库的安装路径不是 /lib 或者 /usr/lib, 那么可以将该动态库的路径加入到动态库配置文件/etc/ld.so.conf里面,假定该动态库的路径是 /usr/local/lib, 那么可以执行以下命令
$ echo "/usr/local/lib" >> /etc/ld.so.conf
$ /sbin/ldconfig
3. 动态库安装到非默认共享库路径(比如/usr/local/lib或者用户自定义的路径),又不想更新/etc/ld.so.conf
有时候,我们自己开发的程序,可能会用到某个我们自己的某个动态库,然后我们不想将我们的自己的动态库安装到默认动态库路径,也不想加入到/etc/ld.so.conf文件,那么我们可以将我们的自己的动态库路径加入到环境变量LD_LIBRARY_PATH,然后运行程序的时候,也会去这个环境变量所指的路径去查找动态库,如果有多个路径,以 ':'分开,比如我们的共享库跟我们的可执行路径放在同一个目录,那么可以如下操作:
$ export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH$
$ ./my_exe
4. 然后如果程序所需的动态库版本比系统已存在的共享库版本低,但是共享库向下兼容的话,可以建个软连接
error while loading shared libraries: libmysqlclient.so.15: cannot open shared object file: No such file or directory
比如我的程序需要libmysqlclient.so.15, 然后系统里面已经有libmysqlclient.so.16,可以做个软连接
ln -s libmysqlclient.so.16 libmysqlclient.so.15