93 lines
3.6 KiB
Markdown
Raw Normal View History

2026-06-26 17:55:15 +08:00
# 依赖库说明
本包为**自带闭包**交付。`lib/` 目录内包含 `libstereo_bolt.so` 运行所需的全部动态库,
**无需在目标板上安装 OpenCV 或任何第三方包**。
---
2026-07-01 18:16:18 +08:00
## 一、包含哪些库lib/ 目录,共 9 个)
2026-06-26 17:55:15 +08:00
| 库 | 说明 |
|---|---|
| `libstereo_bolt.so` | 本算法库(主体) |
| `librknnrt.so` | RKNN NPU 推理运行时Rockchip 2.3.2 |
2026-07-01 18:16:18 +08:00
| `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` 出现。
2026-06-26 17:55:15 +08:00
---
## 二、不在包内(由目标板系统提供)
以下是 Linux 系统 ABI 层,**必须与目标板 glibc 版本严格对齐,绝不能替换**
| 库 | 要求 |
|---|---|
| `libc.so.6` | glibc ≥ 2.32Ubuntu 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` | 动态链接器,系统自带 |
---
## 三、为什么这么设计
2026-07-01 18:16:18 +08:00
**问题:** 如果目标板通过 apt 安装 OpenCVDebian/Ubuntu 会给 SONAME 加私有后缀
(如 `libopencv_core.so.4.5d` 而非标准的 `…4.5`),导致与自行编译的 OpenCV 不兼容;
另外 apt 安装需要联网,新板子部署不可控。
2026-06-26 17:55:15 +08:00
2026-07-01 18:16:18 +08:00
**解法:** 从 OpenCV 4.5.0 官方源码编译,只构建算法实际需要的 7 个模块
core/imgproc/calib3d/imgcodecs/dnn/features2d/flann图像编解码等第三方库
全部静态链入。最终 `lib/` 只有 9 个 `.so`(含本库 + librknnrt**22 MB**
依赖关系极简,无需联网、无需 apt。
2026-06-26 17:55:15 +08:00
---
## 四、运行时加载方式
```bash
2026-07-01 18:16:18 +08:00
# 解包后,设一次环境变量
2026-06-26 17:55:15 +08:00
export LD_LIBRARY_PATH="$(pwd)/lib:$LD_LIBRARY_PATH"
# 验证:应当没有任何 "not found" 输出
ldd lib/libstereo_bolt.so | grep "not found"
```
---
2026-07-01 18:16:18 +08:00
## 五、SONAME 兼容性说明
2026-06-26 17:55:15 +08:00
2026-07-01 18:16:18 +08:00
| 编译来源 | 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 不匹配 |
2026-06-26 17:55:15 +08:00
2026-07-01 18:16:18 +08:00
本包的 `libstereo_bolt.so` 链接的 NEEDED 是标准 `libopencv_*.so.4.5`(无 `d`
与任何从源码编译的 OpenCV 4.5.x 兼容。如果目标板上碰巧装了 apt 的 OpenCV`d`
只要 `LD_LIBRARY_PATH` 优先指向 `lib/`,就会用本包内的库,不会冲突。
2026-06-26 17:55:15 +08:00
2026-07-01 18:16:18 +08:00
---
## 六、编译调用程序时注意
2026-06-26 17:55:15 +08:00
2026-07-01 18:16:18 +08:00
**生产路径**:你自己的代码只用 `include/stereo_bolt/c_api.h`,不引用任何 OpenCV 头,
相机 buffer 直接传给 `sb_process_bolt_module_buffers`**完全不需要 OpenCV 头文件**。
2026-06-26 17:55:15 +08:00
2026-07-01 18:16:18 +08:00
**编译 `example/` 示例**(可选,仅用于集成验证):当前示例是纯 C
只读 headerless Mono8 raw 文件并调用 C ABI不引用 OpenCV 头文件。
运行时仍用本包 `lib/` 里的库。