您当前的位置: 首页 >  搜索

我什么都布吉岛

暂无认证

  • 1浏览

    0关注

    292博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

程序是以何种顺序搜索动态库的

我什么都布吉岛 发布时间:2020-11-23 10:23:44 ,浏览量:1

问题描述

经常出现的,找不到共享文件问题:cannot open shared object file: No such file or directory,其主要原因是没有找到共享库。不仅在程序编译时需要连接库,在运行时同样需要连接库。理解程序运行时库搜索的问题,是解决此类问题的关键。使用命令ldd查看运行时连接库情况,若没有缺失,对应行显示not found。结果可能如下: 1

运行时库以何种顺序搜索
  • -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文件中所有路径下的库载入内存中。

运行时链接与编译时链接的比较

下面对编译时库的查找与运行时库的查找做一个简单的比较:

  1. 编译时查找的是静态库或动态库,而运行时,查找的只是动态库。

  2. 编译时可以用-L指定查找路径,或者用环境变量LIBRARY_PATH,而运行时可以用-Wl,rpath-R选项,或者修改/etc/ld.so.conf文件或者设置环境变量LD_LIBRARY_PATH.

  3. 编译时用的链接器是ld,而运行时用的链接器是/lib/ld-linux.so.2.

  4. 编译时与运行时都会查找默认路径:/lib /usr/lib

  5. 编译时还有一个默认路径:/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

关注
打赏
1658157489
查看更多评论
立即登录/注册

微信扫码登录

0.0374s