linux环境下程序搜索动态库路径和加载相关操作

 

前言:

在linux下编译程序运行时,因为涉及到动态库加载搜索问题,老是会出现加载失败的现象出现,现在整理一下相关知识,供下次遇到问题查看。

 

linux下程序寻找动态库路径:

  • 1.编译生成时,指定的搜索路径。

  在makefile中,一般使用”-Wl -rpath”来指明程序运行时到哪个路径去找库。当指定多个动态库搜索路径时,路径之间用冒号隔开,不能有空格。

  • 2.环境变量LD_LIBRARY_PATH中指定的路径。

       可以使用 echo LD_LIBRARY_PATH查看。一般初始时/lib和/user/lib库包含在里面。用户可以往里面添加。

  • 3./etc/ld.so.cache中缓存的路径。

       /etc/ld.so.conf的第一行有一个引用命令:include ld.so.conf.d/*.conf, 所以可以通过修改/etc/ls.so.conf这个配置文件来增删路径,也可以增加一个.conf文件来配置特有的动态库路径。直接将寻库路径加进来即可,保存后需要运行一下ldconfig重载一下。

  • 4.默认的/lib/和/usr/lib。

  这两个路径是系统最初就添加在LD_LIBRARY_PATH中,所以将库移动到这里亦可以寻找到。

 

动态库相关命令:

  • 1.ld 查看gcc链接程序。
  • 2.ldd查看可执行程序中所依赖的库的程序,后面直接接可执行程序名即可查看该程序需要链接的库已经库路径,如果没找到的库会找不到的提示。
  • 3.ldconfig是用来更新/etc/ld.so.conf的修改生效。
  • 4.nm是用来查看.so库的函数名,标记是T的就是动态库里面生成的名字.

 

Linux下动态库搜索路径顺序问题

以下按优先级排序:

  • 1.编译目标代码时指定的动态库搜索路径;
  • 2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  • 3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
  • 4.默认动态库搜索路径/lib;
  • 5.默认动态库搜索路径/usr/lib;

 

动态库增添方法:

1.在LD_LIBRARY_PATH中增加路径。

  export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX

  这种方式时临时有效,一旦登出就失效了。

2.修改~./bashrc或~/.bash_profile或系统级别的/etc/profile

       export PATH=/wangqinghe/lib:$LD_LIBRARY_PATH

       source .bashrc (source命令通常用于重新执行刚修改的初始化文件,使之立刻生效,而不必注销并重新登录)。

3.在/etc/ld.so.conf中增加路径,或者在/etc/文件目录下增加 *.conf文件去配置自己独有的寻库路径。修改之后要ldconfig一下。

 

补充:

ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.)

 

说明:

程序运行时不会把当前目录作为默认的寻库路径,除非你在编译时指定了。

个人觉得在makefile时指定寻库路径比较好一些,因为它在程序员的控制之中,如果出了问题可以一一排除。

posted @ 2019-12-23 17:21  王清河  阅读(2039)  评论(0编辑  收藏  举报