# 依赖库说明 本包为**自带闭包**交付。`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.32(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。 --- ## 四、运行时加载方式 ```bash # 解包后,设一次环境变量 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/` 里的库。