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

C++ 共享库依赖于具有硬编码路径的其他库,c++,opencv,shared-libraries,C++,Opencv,Shared Libraries,我正在构建opencv,但是一些so库包含对其他共享库的依赖,这些共享库的名称包含路径元素。/../lib,这将导致库在运行时加载失败 我试图更改构建选项,并在网上搜索以了解问题是如何发生的,但找不到答案 这些.so文件中如何包含这些路径元素,以及如何排除它们 例如,下面显示了一个库libopencv\u-calibd3d.so依赖于。/../lib/libopencv\u特性2d.so。我希望从命令的输出中删除那些。/../lib/: ~sample/opencv/test$ objdump

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

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

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

例如,下面显示了一个库
libopencv\u-calibd3d.so
依赖于
。/../lib/libopencv\u特性2d.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….
    。无论如何,你需要删除这个
  • 使用like
    “~/deps/A/lib/libA.so”
    链接if
    libA.so
    没有
    SONAME
    。您需要将
    SONAME
    设置为
    libA.so