linux对动态库的搜索知识梳理

一.动态库优先搜索路径顺序

之前的文章我有整理过,这里再列出来一次

1. 编译目标代码时指定的动态库搜索路径;

2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4. 默认的动态库搜索路径/lib和/usr/lib;

补充说明

/etc/ld.so.conf 文件记录了编译时使用的动态库的路径,也就是加载so库的路径。/etc/ld.so.conf文件中有一句include ld.so.conf.d/*.conf,它把ld.so.conf.d 文件夹下所有conf文件中路径加载到 ld.so.conf 中,配置后要运行 ldconfig命令才能生效。

提示:默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件。因此若在用源码安装时,未使用--prefix指定安装路径为/usr/lib,就可能会报找不到相关的.so库的错误。

二.ldconfig程序

2.1ldconfig介绍

ldconfig是动态链接库的管理命令,位于/sbin下,其作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件,缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

linux下的共享库机制采用了类似高速缓存机制,将库信息保存在/etc/ld.so.cache,程序连接的时候首先从这个文件里查找,然后再到ld.so.conf的路径中查找。因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新的搜索路径,为了让动态链接库为系统所共享,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径。

2.2如何让系统找到安装的动态库

1.如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。

2.如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下:

        a. 编辑/etc/ld.so.conf文件,加入库文件所在目录的路径;

        b. 运行ldconfig ,该命令会重建/etc/ld.so.cache文件;

3.添加环境变量;

三.linux程序添加动态库文件目录到环境变量的几种办法

上一节的第二小节提到了如何让系统找到安装的动态库,这一节详细介绍下执行的步骤。

3.1添加环境变量

3.1.1添加当前用户当前的环境变量--临时

注意,这里冒号起一个分隔作用,“.”表示当前目录,“/home/czd/...”表示另外一个目录。

export LD_LIBRARY_PATH=/home/czd/... #.so file path

3.1.2添加当前用户的环境变量

修改~/.bashrc文件,在其末尾添加环境变量。

vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/... #.so file path

使其生效指令:

source ~/.bashrc

如不生效,请重启。

3.1.3添加所有用户的环境变量

修改profile文件,在其末尾添加环境变量。

vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/... #.so file path

使其生效指令:

source /etc/profile

如不生效,请重启。

3.2添加ldconfig寻找路径

步骤

1.编辑链接配置文件

vim /etc/ld.so.conf

2.确认内容是否如下,不是则修改为如下,保存并退出

include /etc/ld.so.conf.d/*.conf

3.进入目录内,创建*.conf文件,文件名随意,扩展名必须为.conf

cd /etc/ld.so.conf.d/
vim libmy.conf

4.在文件内部,添加so的路径,保存并退出

/home/czd/XXXX/XXXX

5.执行命令使其生效

sudo ldconfig

程序在运行时寻找so库就会添加到目录中寻找。

3.3赋值so文件到lib路径

linux系统的so库一般存储在“lib”,“/usr/lib/”路径中,可将动态库复制到该路径中。

sudo cp libtest.so /usr/lib/

四.查看可执行文件依赖的库

ldd

dd : 列出动态依赖,显示一个程序运行时所需要的共享库。

ldd 会解析出每个库引用,使用的搜索方式与动态链接器一样,并以下面的形式显示结果:

library-name => resolves-to-path

对于多数的 ELF 文件,ldd 至少会列出与 ld-linux.so.2、动态链接器以及标准 C 库 lib.so.6 相关的条目。

提示:对于使用了交叉编译工具的可执行文件,不能用宿主环境的ldd命令查看其依赖的库文件,可以使用readelf命令查看或者在其相应的环境使用ldd命令查看。

nm

nm 命令会列出目标库或可执行文件中定义的一组符号,常用来寻找哪些库定义了一个符号。

你可能感兴趣的:(GCC编译器学习笔记,linux,服务器,windows,arm)