问题:
Linux下程序编译通过了,但是运行时提示 :error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file or directory
原因是没有找到动态链接库文件。
链接时可以通过-L和-l来指定自己的库,因此链接可以通过,但是运行时,系统仍无法找到指定的库,需要配置一下。
解决方法:
1)首先确认 缺少的so库文件。
2)之后用ldd 查看连接关系: ldd <可执行程序>
例如:ldd /opt/postgresql/postgresql/bin/createdb
linux-gate.so.1 => (0x77f2f000)
libpq.so.5 => not found
libz.so.1 => /usr/lib/libz.so.1 (0x00698000)
libreadline.so.5 => /usr/lib/libreadline.so.5 (0x037f1000)
3)将自己的库所在路径添加到/etc/ld.so.conf文件中。但一般这个文件中的内容都是一句“include /etc/ld.so.conf.d/*.conf”,
因此最好在/etc/ld.so.conf.d/目录下新建一个文件 , 如“xxx.conf”,然后将自己的库所在路径添加到这个conf文件中。
4)修改完文件后,以root身份运行 /sbin/ldconfig -v 。
另一种方法:
1.将用户用到的库统一放到一个目录,如 /usr/loca/lib
# cp libXXX.so.X /usr/loca/lib/
2.向库配置文件中,写入库文件所在目录
# vim /etc/ld.so.conf.d/usr-libs.conf
/usr/local/lib
3.更新/etc/ld.so.cache文件
# ldconfig
这里采用第二种办法,它更为方便,对于原系统的改动也最小。而/etc/ld.so.conf的文件内容是include /etc/ld.so.conf.d/*.conf,所以在/etc/ld.so.conf.d目录下,加入任何以.conf为后缀的文件,都能被ld识别。
ld.so.cache的更新是递增式的,就像PATH系统环境变量一样,不是从头重新建立,而是向上累加。只有重新开机,系统才从零开始建立ld.so.cache文件。