93 lines
3.6 KiB
Markdown
93 lines
3.6 KiB
Markdown
# 依赖库说明
|
||
|
||
本包为**自带闭包**交付。`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。
|
||
|
||
---
|
||
|
||
## 四、运行时加载方式
|
||
|
||
```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/` 里的库。
|