经常出现的,找不到共享文件问题:cannot open shared object file: No such file or directory
,其主要原因是没有找到共享库。不仅在程序编译时需要连接库,在运行时同样需要连接库。理解程序运行时库搜索的问题,是解决此类问题的关键。使用命令ldd
查看运行时连接库情况,若没有缺失,对应行显示not found
。结果可能如下:
-wl -rpath
[2]选项。编译时指定的运行时动态库搜索路径,注意区分编译动态库搜索路径-L
LD_LIBRARY_PATH
环境变量(export LD_LIBRARY_PATH=/home/Desktop/:$LD_LIBRARY_PATH)/etc/ld.so.conf
配置文件/lib
系统lib文件夹/usr/lib
用户lib文件夹
解决方法是往上述五个路径中添加我们库路径,或者拷贝进去对应文件夹。需要注意的是,使用LD_LIBRARY_PATH
环境变量,要source
;/etc/ld.so.conf
则要使用ldconfig
完成重新读取配置(重启不行)。该命令会将/etc/ld.so.conf
文件中所有路径下的库载入内存中。
下面对编译时库的查找与运行时库的查找做一个简单的比较:
-
编译时查找的是静态库或动态库,而运行时,查找的只是动态库。
-
编译时可以用-L指定查找路径,或者用环境变量
LIBRARY_PATH
,而运行时可以用-Wl
,rpath
或-R
选项,或者修改/etc/ld.so.conf
文件或者设置环境变量LD_LIBRARY_PATH
. -
编译时用的链接器是
ld
,而运行时用的链接器是/lib/ld-linux.so.2
. -
编译时与运行时都会查找默认路径:
/lib
/usr/lib
-
编译时还有一个默认路径:
/usr/local/lib
,而运行时不会默认找查该路径。
对于2,如果需要设置LD_LIBRARY_PATH
,在shell中不能使用=
,需要使用`export LD_LIBRARY_PATH=“XXXX”。
[1] https://blog.csdn.net/liu0808/article/details/80176326 [2] -wl,-rpath
是一个整体,-wl
用于告知gcc这是一个传递给连接器的选项,-rpath=xxxx
则是真正传递给连接器的选项。-rpath
可以简写成-R不过形式变成 -R xxxx