前言:
在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时指定寻库路径比较好一些,因为它在程序员的控制之中,如果出了问题可以一一排除。