MDC610 上要装 opencv,rpm 里没有:先 ffmpeg 后 opencv 的交叉编译顺序
11 月 10 日论坛里一个提问:MDC 610,1.99.220 版本,想装 opencv,提供的 rpm 里没有 ffmpeg 和 opencv,问交叉编译库怎么装。2 楼版主只指了一章文档,没给具体做法。我按那章的框架回了一帖,这里把那帖扩开写全:先确认 rpm 里到底有没有,再按先 ffmpeg 后 opencv 的顺序源码交叉编译,最后在板卡上验一遍。
先花一分钟确认 rpm 里到底有没有
别一上来就编源码。提问者的原话是 rpm 里没有,但清单这东西容易漏看——devel 包、名字带版本号的包,grep 一遍比凭印象准:
rpm -qa | grep -iE 'opencv|ffmpeg'
同时在提供的 rpm 目录里再搜一次 opencv、ffmpeg 两个词,包括 -devel 包。如果找到对应的 aarch64 rpm,优先用 rpm 装,源码那条路就不用走了。
这里有个版本口径要先对一下:帖子正文写的是 MDC 610 1.99.220,1 楼提问者自己又写了 1.1.027-0000000T1,两处不一致。我没有提问者那份 rpm 清单,没法替他确认 1.1.027 到底补没补这两个库的 rpm——工具链名和 sysroot 路径,按 1.1.027 那份《编译环境搭建指南》核对一遍再动手。
不要在 x86 编译机上直接装一份 opencv
这条最容易踩:编译机上 apt install libopencv-dev 或者 yum 装一份,编是编过去了,拷到板卡上链接就报错。那份是给 x86 本机用的,MDC 板卡是 aarch64,架构不对。交叉编译的意思就是在 x86 机器上编出 aarch64 的东西,编译器、sysroot、链接路径全都要指到交叉环境,不能混用本机的库。
动手前先确认工具链可用:
aarch64-linux-gnu-gcc --version
能正常输出版本号再往下走。工具链名和 sysroot 路径以手头那份指南为准,不同版本可能不一样,别照抄别人的路径。
第一步:编 ffmpeg
顺序不能反。opencv 开 WITH_FFMPEG 要先有 ffmpeg,所以先编 ffmpeg,后编 opencv。
./configure --enable-cross-compile \
--cross-prefix=aarch64-linux-gnu- \
--arch=aarch64 \
--target-os=linux \
--sysroot=<交叉编译环境的 sysroot> \
--prefix=<安装目录>
make -j$(nproc) && make install
--prefix 指到交叉环境里的安装目录,别装到本机 /usr/local。编完确认安装目录下有 lib/libavcodec.so 这类东西,再往下走。
第二步:编 opencv,靠一个工具链文件
opencv 用 cmake,关键是先写一个工具链文件,把三件事定死:目标系统是 Linux、处理器是 aarch64、编译器是交叉编译器,再把 CMAKE_FIND_ROOT_PATH 指向 sysroot,让 cmake 找头文件和库的时候只在 sysroot 里找,不去翻本机的 /usr/include。
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH <交叉编译环境的 sysroot>)
然后:
cmake -DCMAKE_TOOLCHAIN_FILE=<工具链文件> \
-DCMAKE_BUILD_TYPE=Release \
-DWITH_FFMPEG=ON \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_EXAMPLES=OFF \
<opencv 源码目录>
make -j$(nproc) && make install
几个开关是特意关掉的:python2/python3 的绑定、测试和性能测试、示例,板卡上用不上,关掉能省不少编译时间。WITH_FFMPEG=ON 依赖上一步的 ffmpeg——如果 ffmpeg 那步还没做,这里先改成 OFF,等 ffmpeg 编好再回头开 ON 重新编。
第三步:拷到板卡上,验架构再验运行
编译产物拷到板卡运行环境的库目录,跑一遍 ldconfig,或者临时:
export LD_LIBRARY_PATH=<板卡上的库目录>
验证分两步,缺一不可。先验架构:
file libopencv_core.so
输出里要是 aarch64,不是 x86-64。这一步过了,再写个最小的读视频或者读图程序,在板卡上跑通——能打开文件、读出帧,才算装好了。只 file 对了不跑程序,等于没验;只在编译机上跑通了也不算,板卡上的运行环境和编译机不是一回事。
这条路走不通时,先看哪一环
- configure 找不到交叉编译器:
--cross-prefix和 PATH 对一下,工具链是不是没加进 PATH。 - cmake 找到本机的库:工具链文件里的
CMAKE_FIND_ROOT_PATH没生效,或者没设CMAKE_FIND_ROOT_PATH_MODE_LIBRARY这类模式,cmake 又去翻本机路径了。 - 链接时报
skipping incompatible:编出来的 .o 是 x86 的,说明某一步用了本机 gcc 而不是交叉编译器,从 ffmpeg 那步重查。 - 板卡上跑起来报
cannot open shared object file:库目录没进 ldconfig 缓存,或者LD_LIBRARY_PATH没 export 到运行那个程序的 shell。
rpm 里没有现成的库,就只能走源码交叉编译这条路。顺序是死的:先确认 rpm、再 ffmpeg、再 opencv、最后板卡上验架构验运行。哪一步省了,后面就得回来补。
- 点赞
- 收藏
- 关注作者
评论(0)