一个C/C++程序,需要给它提供两次依赖库的路径,第一次是编译的时候,第二次的程序运行的时候。
这里说说第二次程序运行时,链接器是如何找依赖库的。
假设,我的程序P,依赖动态库A,动态库A依赖动态库B。
第一步:连接器会读取程序P中的 rpath参数,这个参数就是告诉动态链接库去什么地方搜索依赖库A。如果找不到或者没有设置 rpath,进行第二步。
第二步:获取环境变量 LD_LIBRARY_PATH 设置的路径,查找依赖库A。如果还没有找到,进行第三步。
第三步:获取/etc/ls.so.conf 或者 /etc/ld.so.conf.d下文件 中的路径,进行查找。再没找到,报错:什么no such file or .......
如果找到依赖库B:
第一步:连接器会读取依赖库A中的 rpath参数,这个参数就是告诉动态链接库去什么地方搜索依赖库B。如果找不到或者没有设置 rpath,进行第二步。
第二步:获取环境变量 LD_LIBRARY_PATH 设置的路径,查找依赖库B。如果还没有找到,进行第三步。
第三步:获取/etc/ls.so.conf 或者 /etc/ld.so.conf.d下文件 中的路径,进行查找。再没找到,报错:什么no such file or .......
一般情况下,如果存在多层依赖,我们是没有办法通过rpath的形式指定依赖库搜索路径的,乖乖加环境变量,或者在ld.so.conf中添加路径。
另外:1、如果给的路径下存在相同名字的库,先到先得原则。
2、如果给的路径下存在相同名字的库,但是两个库的架构是不同的(如:一个是arm的,一个是x86的),连接器会识别跳过结构不适合的那个,继续向下查找。