我正在构建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