0
Error msg:
error while loading shared libraries: libopencv_imgcodeds.so.3.0: cannot open shared object file: No such file or directory
1
表面上看没找到文件,不过深究原因一般有两个:
一个是确实没有该文件,即没有安装该共享库;
另一个是已经安装了该共享库,但是执行需要调用该共享库程序的时候,程序按照默认共享库路径找不到该共享库文件。
所以如果安装共享库了,那么就需要正确设置共享库路径。
2
在Linux下,共享库的寻找和加载是由lib/ld.so
实现的。(我在我机器里找到了/lib/ld-2.22.so
,我觉得应该是这个)
然后ld.so
在标准路径(/lib/, /usr/lib/)中寻找应用程序用到的共享库。
那么非标准路径呢?
3. 非标准路径
目前Linux通用的做法是将非标准路径加入/etc/ld.so.conf
,然后运行ldconfig
生成/etc/ld.so.cache
。
然后ld.so
加载共享库时,会从这个ld.so.cache
查找。
附:UNIX还有一个环境变量:LD_LIBRARY_PATH
。ld.so
加载共享库的时候,也会查找这个变量所设置的路径。如:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib
export LD_LIBRARY_PATH
不过尽量避免使用。
4. ldd
ldd - print shared object dependencies
即打印共享库的依赖关系。
ldd
是一个shell脚本(可以whereis
然后vim
看一下)
它可以显示可执行模块的dependency,原理是通过设置一系列的环境变量,如LD_TRACE_LOADED_OBJECTS
, LD_WARN
, LD_BIND_NOW
, LD_LIBRARY_VERSION
, LD_VERBOSE
等。
当LD_TRACE_LOADED_OBJECTS
环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序不真正执行。可以测试:
- `$ export LD_TRACE_LOADED_OBJECTS=1`
- 再执行任意程序,如`ls`,看看程序的运行结果
5. ldconfig
ldconfig - configure dynamic linker run-time bindings
ldconfig
是一个动态链接库管理命令,目的是让动态链接库为系统所共享。
用途
主要是在默认搜寻目录(/lib/
, /usr/lib/
)以及动态库配置文件/etc/ld.so.conf
内所列的目录下,搜寻出可共享的动态链接库(格式如lib*.so*
),进而创建出动态装入程序(ld.so
)所需的连接和缓存文件。
缓存文件默认为/etc/ld.so.cache
,此文件保存已排好序的动态链接库名字列表。
使用时机
ldconfig
通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。