共享库依赖于具有硬编码路径的其他库



我正在构建opencv,但一些so库包含对其他共享库的依赖项,这些共享库的名称包含路径元素../../lib,这将导致在运行时加载库失败。

我试图更改构建选项,并在网上搜索问题是如何发生的,但找不到答案。

这些路径元素是如何包含在.so文件中的,以及如何排除它们?

作为一个示例,下面显示了一个库libopencv_calibd3d.so依赖于../../lib/libopencv_features2d.so。我希望从命令的输出中删除../../lib/

~sample/opencv/test$ objdump -p libopencv_calib3d.so | grep NEEDED
NEEDED               ../../lib/libopencv_features2d.so
NEEDED               ../../lib/libopencv_flann.so
NEEDED               ../../lib/libopencv_highgui.so
NEEDED               ../../lib/libopencv_imgproc.so
NEEDED               ../../lib/libopencv_core.so
NEEDED               libstdc++.so.6
NEEDED               libm.so.6
NEEDED               libgcc_s.so.1
NEEDED               libc.so.6

基于对共享库的另一个问题的阅读,在不硬编码完全依赖路径的情况下,有两种方法可以对路径进行编码:

  • 使用-Wl,-rpath....。不知怎么的,你需要删除这个
  • 如果libA.so没有SONAME,则使用类似的"~/deps/A/lib/libA.so"进行链接。您需要将SONAME设置为libA.so

相关内容

最新更新