之前写了个程序,使用了第三方库lzma(装了xz命令(make install))。程序写好以后,编译没有问题,但是运行时却报了如下的错误:
./Searcher: error while loading sharedlibraries: liblzma.so.5: cannot open shared object file: No such file or directory
我重新察看了一下当时安装xz的log,发现liblzma.so.5其实已经在如下目录里面了
ll /usr/local/lib/liblzma.so.5.0.5
-rwxr-xr-x 1 root root 562091 Aug 13 16:37/usr/local/lib/liblzma.so.5.0.5
但为什么程序运行时找不到呢?
在网上查询了一下答案,可能的原因是虽然库文件已经放在系统动态库路径下面了,但是系统并不能自动识别它,需要手动告诉系统它的存在(除非重起服务器)。只需要简单的一条命令ldconfig,系统就会自己去重新生成一份动态库文件了。
另外,其实我们在启动程序之前,也可以考察一下其动态库是否都能找到,使用ldd命令即可:
ldd ./Searcher
libdl.so.2 => /lib64/libdl.so.2 (0x000000323e800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000323ec00000)
liblzma.so.5 => not found
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003251e00000)
libm.so.6 => /lib64/libm.so.6 (0x000000323e400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000324fa00000)
libc.so.6 => /lib64/libc.so.6 (0x000000323e000000)
/lib64/ld-linux-x86-64.so.2 (0x000000323dc00000)
顺道再提一下编译的情况。如果需要使用某个第三方动态库文件,在编译选项中需要这么写:-llzma。其中-l表示需要使用某库文件(动态库或者静态库)。lzma只是库名的简称,系统会自动在前面加上lib,在后面加上.so。再举一个例子,如果使用libm.so.6,只需要这么写:-lm。对于需要静态加载的库文件(通常以.a结尾,而非.so),需要使用编译选项的-L来标明静态库文件的路径。