3.6 KiB
依赖库说明
本包为自带闭包交付。lib/ 目录内包含 libstereo_bolt.so 运行所需的全部动态库,
无需在目标板上安装 OpenCV 或任何第三方包。
一、包含哪些库(lib/ 目录,共 9 个)
| 库 | 说明 |
|---|---|
libstereo_bolt.so |
本算法库(主体) |
librknnrt.so |
RKNN NPU 推理运行时(Rockchip 2.3.2) |
libopencv_core.so.4.5 |
OpenCV 4.5.0 — 基础矩阵/图像容器 |
libopencv_imgproc.so.4.5 |
OpenCV 4.5.0 — 图像处理 |
libopencv_calib3d.so.4.5 |
OpenCV 4.5.0 — 立体标定、rectify、三角测量 |
libopencv_imgcodecs.so.4.5 |
OpenCV 4.5.0 — 图像文件读写 |
libopencv_dnn.so.4.5 |
OpenCV 4.5.0 — DNN 模块 |
libopencv_features2d.so.4.5 |
OpenCV 4.5.0 — 特征点(calib3d 依赖) |
libopencv_flann.so.4.5 |
OpenCV 4.5.0 — FLANN 索引(features2d 依赖) |
OpenCV 从源码编译(非 apt 包),SONAME 为标准的
libopencv_*.so.4.5(不带 Debian/Ubuntu 的d后缀),与自行源码编译 OpenCV 4.5.x 的环境兼容。图像编解码(libjpeg/libpng/libtiff/libwebp/openjpeg)、protobuf、zlib 均已静态链入 OpenCV,不再作为独立
.so出现。
二、不在包内(由目标板系统提供)
以下是 Linux 系统 ABI 层,必须与目标板 glibc 版本严格对齐,绝不能替换:
| 库 | 要求 |
|---|---|
libc.so.6 |
glibc ≥ 2.35(Ubuntu 22.04 = 2.35,满足) |
libpthread.so.0 |
同上(已并入 glibc 2.34+) |
libm.so.6 |
同上 |
libdl.so.2 |
同上 |
libstdc++.so.6 |
GCC 11+(Ubuntu 22.04 自带) |
libgcc_s.so.1 |
同上 |
ld-linux-aarch64.so.1 |
动态链接器,系统自带 |
三、为什么这么设计
问题: 如果目标板通过 apt 安装 OpenCV,Debian/Ubuntu 会给 SONAME 加私有后缀
(如 libopencv_core.so.4.5d 而非标准的 …4.5),导致与自行编译的 OpenCV 不兼容;
另外 apt 安装需要联网,新板子部署不可控。
解法: 从 OpenCV 4.5.0 官方源码编译,只构建算法实际需要的 7 个模块
(core/imgproc/calib3d/imgcodecs/dnn/features2d/flann),图像编解码等第三方库
全部静态链入。最终 lib/ 只有 9 个 .so(含本库 + librknnrt),约 22 MB,
依赖关系极简,无需联网、无需 apt。
四、运行时加载方式
# 解包后,设一次环境变量
export LD_LIBRARY_PATH="$(pwd)/lib:$LD_LIBRARY_PATH"
# 验证:应当没有任何 "not found" 输出
ldd lib/libstereo_bolt.so | grep "not found"
五、SONAME 兼容性说明
| 编译来源 | SONAME | 与本包兼容? |
|---|---|---|
| 本包(源码编译 4.5.0) | libopencv_core.so.4.5 |
✅ |
| 自行源码编译 4.5.x | libopencv_core.so.4.5 |
✅ |
Ubuntu apt libopencv-dev |
libopencv_core.so.4.5d |
❌ SONAME 不匹配 |
本包的 libstereo_bolt.so 链接的 NEEDED 是标准 libopencv_*.so.4.5(无 d),
与任何从源码编译的 OpenCV 4.5.x 兼容。如果目标板上碰巧装了 apt 的 OpenCV(带 d),
只要 LD_LIBRARY_PATH 优先指向 lib/,就会用本包内的库,不会冲突。
六、编译调用程序时注意
生产路径:你自己的代码只用 include/stereo_bolt/c_api.h,不引用任何 OpenCV 头,
相机 buffer 直接传给 sb_process_bolt_module_buffers,完全不需要 OpenCV 头文件。
编译 example/ 示例(可选,仅用于集成验证):当前示例是纯 C,
只读 headerless Mono8 raw 文件并调用 C ABI,不引用 OpenCV 头文件。
运行时仍用本包 lib/ 里的库。