库文件 (*.so) 如何解析共享依赖项?

net*_*ain 3 libraries dependencies dynamic-linking shared-library

如果我调用以下命令:

ldd mylib.so
Run Code Online (Sandbox Code Playgroud)

这会产生一些类似的东西:

libopencv_features2d.so.4.1 => /usr/local/lib/libopencv_features2d.so.4.1 (0x00007f83dee6b000)
Run Code Online (Sandbox Code Playgroud)

如果我复制/usr/local/lib/libopencv_features2d.so.4.1到我当前的工作目录中,那么我希望 ldd 显示=> ./libopencv_features2d.so.4.1 (0x00007f83dee6b000)

相反,它仍然将其解析为/usr/local/lib。这是为什么?像这样的系统依赖是如何解决的?是否还有一种方法可以影响解决依赖项的方式?我可以强制它解析到我的本地目录吗?

Ste*_*itt 6

动态链接器会在各种位置查找库,但默认情况下这些库不包括当前目录。在 Linux 上,列表是

  • 在二进制文件的 rpath 中定义的路径,如果有的话;
  • 中列出的路径LD_LIBRARY_PATH(如果有);
  • 二进制文件的运行路径中定义的路径(如果有);
  • 中已知的库/etc/ld.so.cache
  • 系统的库路径(/usr/lib等)。

上面的链接提供了更多详细信息。

您可以通过导出来影响解决依赖项的方式LD_LIBRARY_PATH;特别是在您的情况下:

export LD_LIBRARY_PATH=.
Run Code Online (Sandbox Code Playgroud)

(不要将其设置为该值。)