MDC610 上要装 opencv,rpm 里没有:先 ffmpeg 后 opencv 的交叉编译顺序

举报
yd_255586444 发表于 2026/11/12 10:18:00 2026/11/12
【摘要】 11 月 10 日论坛里一个提问:MDC 610,1.99.220 版本,想装 opencv,提供的 rpm 里没有 ffmpeg 和 opencv,问交叉编译库怎么装。2 楼版主只指了一章文档,没给具体做法。我按那章的框架回了一帖,这里把那帖扩开写全:先确认 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、最后板卡上验架构验运行。哪一步省了,后面就得回来补。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。