如果我调用以下命令:
ldd mylib.so
然后会产生如下结果:
libopencv_features2d.so.4.1 => /usr/local/lib/libopencv_features2d.so.4.1 (0x00007f83dee6b000)
如果我复制/usr/local/lib/libopencv_features2d.so.4.1
到当前的工作目录中,我会期望 ldd 显示=> ./libopencv_features2d.so.4.1 (0x00007f83dee6b000)
相反,它仍然将其解析为/usr/local/lib
.这是为什么?像这样的系统依赖性如何解决?还有一种方法可以影响依赖关系的解决方式吗?我可以强制它解析到我的本地目录吗?
答案1
动态链接器在各个位置查找库,但默认情况下不包括当前目录。在 Linux 上,清单是
- 二进制文件的 rpath 中定义的路径(如果有);
- 中列出的路径
LD_LIBRARY_PATH
(如果有); - 二进制文件的运行路径中定义的路径(如果有);
- 已知的图书馆
/etc/ld.so.cache
; - 系统的库路径(
/usr/lib
等)。
上面的链接提供了更多详细信息。
您可以通过导出来影响解决依赖关系的方式LD_LIBRARY_PATH
;特别是在你的情况下:
export LD_LIBRARY_PATH=.
(不要将其设置为该值。)