linux 怎么找共享的文件在哪里找,[转][整理]Linux下找不到共享库(shared object)...

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通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

References

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值