文章目录
程序动态库的搜索路径
程序运行时所需的动态库的搜索路径
- ELF可执行文件中动态段DT_RPATH指定;gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径;
- 环境变量LD_LIBRARY_PATH指定路径;(多用于临时指定)
LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:
- LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录.
- LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。
- /etc/ld.so.cache中缓存的动态库路径。可以通过修改配置文件/etc/ld.so.conf 增删路径(修改后需要运行ldconfig命令);
linux下的共享库机制采用了类似于高速缓存的机制,将库信息保存在/etc/ld.so.cache里边。程序连接的时候首先从这个文件里边查找
ldconfig是一个动态链接库管理命令,其用途来生成/etc/ld.so.cache. 生成过程如下:
在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件,缓存文件默认为 /etc/ld.so.cache.
程序编译时搜索的路径
- gcc -L 指定的目录
- gcc的环境变量LIBRARY_PATH
- 编译gcc时写在程序内的内定目录例如:/lib/:/usr/lib/:/usr/lib/x86_64-linux-gnu/7/…
gcc的选项-print-search-dirs,会显示显示编译器的搜索路径,其中 libraries 选项就是上面所说的动态库搜索路径。
查看动态连接库的相关命令
- ldconfig
通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
常用命令 ldconfig -p //打印出ld.so.cache缓存中的动态链接库
- ldd
ldd不是一个可执行程序,而只是一个shell脚本
ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量例如:LD_TRACE_LOADED_OBJECTS,将其设置为1,在运行会显示模块的dependency,而程序并不真正执行。(本质是通过ld-linux.so(elf动态库的装载器)来实现的.
- nm用来查看.so库中的函数名字
动态库的常见问题
1./usr/bin/ld: cannot find -lxxx
解决:
- 查看前文提到的搜索目录下是否有libxxx.so动态库。
- 如果有名称对不对,不对可以符号连接ln -sv过去。
- 如果还不对,就是版本不匹配,下载相应的版本。
2. /usr/bin/ld: skipping incompatible
解决:
- sudo apt-get install gcc-X-multilib //X是gcc对应的版本