前言

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

Linux下程序运行时寻找动态库路径:

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

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

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

    1. 可以使用 echo LD_LIBRARY_PATH查看。一般初始时/lib和/user/lib库包含在里面(现在的系统,**初始值为空**)。用户可以往里面添加。
  • /etc/ld.so.cache中缓存的路径。

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

  这两个路径是系统默认的库目录,所以将库移动到这里亦可以寻找到。

动态库相关命令

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

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

以下按优先级排序:

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

    动态库增添方法

  • 在LD_LIBRARY_PATH中增加路径。

  export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX
  这种方式时临时有效,一旦登出就失效了。

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

     export PATH=/wangqinghe/lib:$LD_LIBRARY_PATH<br />       source .bashrc (source命令通常用于重新执行刚修改的初始化文件,使之立刻生效,而不必注销并重新登录)。
    
  • 在/etc/ld.so.conf中增加路径

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

补充

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

说明

程序运行时不会把当前目录作为默认的寻库路径,除非你在编译时指定了。
个人觉得在makefile时指定寻库路径比较好一些,因为它在程序员的控制之中,如果出了问题可以一一排除。