You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RKNN1808交叉编译含FFmpeg的OpenCV4.5.3遇链接错误求助

RKNN1808平台交叉编译依赖FFmpeg的OpenCV4.5.3链接错误解决方案

问题背景

在RKNN1808平台移植实时视频流目标检测C++推理程序时,使用CMake交叉编译依赖FFmpeg的OpenCV4.5.3,链接阶段出现大量FFmpeg函数未定义错误,提示找不到libavcodec.so.58等库,libopencv_videoio.so.4.5.3存在大量未定义FFmpeg符号,最终编译失败。

已配置信息

FFmpeg交叉编译命令

./configure --enable-cross-compile --cross-prefix=/home/midsummer/Tool/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- --target-os=linux --arch=aarch64 --prefix=/usr/local/ffmpeg  --enable-shared

FFmpeg版本

libavutil      56. 70.100
libavcodec     58.134.100
libavformat    58. 76.100
libavdevice    58. 13.100
libavfilter     7.110.100
libswscale      5.  9.100
libswresample   3.  9.100
libpostproc    55.  9.100

OpenCV CMake配置命令

cmake -D CMAKE_BUILD_TYPE=RELEASE  -D CMAKE_C_COMPILER=/home/midsummer/Tool/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -D CMAKE_CXX_COMPILER=/home/midsummer/Tool/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ -D BUILD_SHARED_LIBS=ON -D CMAKE_CXX_FLAGS=-fPIC -D CMAKE_C_FLAGS=-fPIC -D CMAKE_EXE_LINKER_FLAGS=-lpthread -ldl -D ENABLE_PIC=ON -D WITH_1394=OFF -D WITH_ARAVIS=OFF -D WITH_ARITH_DEC=ON -D WITH_ARITH_ENC=ON -D WITH_CLP=OFF -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF -D WITH_CUFFT=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_HALIDE=OFF -D WITH_HPX=OFF -D WITH_IMGCODEC_HDR=ON -D WITH_IMGCODEC_PXM=ON -D WITH_IMGCODEC_SUNRASTER=ON -D WITH_INF_ENGINE=OFF -D WITH_IPP=OFF -D WITH_ITT=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LAPACK=ON -D WITH_LIBREALSENSE=OFF -D WITH_NVCUVID=OFF -D WITH_OPENCL=OFF -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=OFF -D WITH_OPENGL=OFF -D WITH_OPENMP=OFF -D WITH_OPENNNI=OFF -D WITH_OPENNNI2=OFF -D WITH_OPENVX=OFF -D WITH_PNG=OFF -D WITH_PROTOBUF=OFF -D WITH_PTHREADS_PF=ON -D WITH_PVAPI=OFF -D WITH_QT=OFF -D WITH_QUIRC=OFF  -D WITH_TBB=OFF -D WITH_TIFF=ON -D WITH_VULKAN=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D CMAKE_INSTALL_PREFIX=../CrossCompileResult  -D WITH_GTK=OFF  -D BUILD_opencv_dnn=OFF ..

CMake识别FFmpeg状态

--   Video I/O:
--     FFMPEG:                      YES
--       avcodec:                   YES (58.134.100)
--       avformat:                  YES (58.76.100)
--       avutil:                    YES (56.70.100)
--       swscale:                   YES (5.9.100)
--       avresample:                NO
--     GStreamer:                   NO
--     v4l/v4l2:                    YES (linux/videodev2.h)

已尝试方法

  • 确认FFmpeg与OpenCV版本完全匹配
  • 配置正确PKG_CONFIG_PATH
  • 更换OpenCV/FFmpeg版本
  • 重新编译FFmpeg
  • 调整PKG_CONFIG_PATH
  • 复制FFmpeg的PC文件

解决方案

1. 强制指定FFmpeg库路径与链接顺序

在OpenCV的CMake配置中,手动指定FFmpeg的头文件和库路径,避免CMake自动检测时的路径偏差。注意库的链接顺序:依赖其他库的模块要放在被依赖模块前面(比如libavcodec依赖libavutil,所以libavutil要放在libavcodec之后):

cmake \
# 保留原有其他参数...
-D FFMPEG_INCLUDE_DIRS=/usr/local/ffmpeg/include \
-D FFMPEG_LIBRARIES="\
/usr/local/ffmpeg/lib/libavcodec.so;\
/usr/local/ffmpeg/lib/libavformat.so;\
/usr/local/ffmpeg/lib/libswscale.so;\
/usr/local/ffmpeg/lib/libavutil.so" \
..

2. 修正交叉编译环境的库搜索路径

确保交叉编译链接器能找到FFmpeg的共享库:

  • 添加CMAKE_SYSROOT参数指定目标平台根文件系统路径(如果有):
    -D CMAKE_SYSROOT=/path/to/rknn1808/sysroot
    
  • 或者在CMAKE_EXE_LINKER_FLAGS中显式添加FFmpeg库的搜索路径:
    -D CMAKE_EXE_LINKER_FLAGS="-L/usr/local/ffmpeg/lib -lpthread -ldl"
    

3. 重新编译FFmpeg并添加--enable-pic参数

生成支持位置无关代码的FFmpeg库,避免链接时的符号问题:

./configure \
--enable-cross-compile \
--cross-prefix=/home/midsummer/Tool/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- \
--target-os=linux \
--arch=aarch64 \
--prefix=/usr/local/ffmpeg \
--enable-shared \
--enable-pic
make clean && make -j16 && make install

4. 检查OpenCV videoio模块的链接配置

查看OpenCV编译目录下的modules/videoio/CMakeFiles/opencv_videoio.dir/link.txt文件,确认是否正确链接了所有FFmpeg依赖库。如果缺少,手动添加对应的库路径和文件名,然后重新执行make -j16。

5. 尝试静态编译FFmpeg与OpenCV

如果共享库链接问题难以排查,切换为静态编译模式:

步骤1:静态编译FFmpeg

./configure \
--enable-cross-compile \
--cross-prefix=/home/midsummer/Tool/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- \
--target-os=linux \
--arch=aarch64 \
--prefix=/usr/local/ffmpeg-static \
--disable-shared \
--enable-static \
--enable-pic
make clean && make -j16 && make install

步骤2:静态编译OpenCV并链接静态FFmpeg库

cmake \
# 保留原有其他参数...
-D FFMPEG_LIBRARIES="\
/usr/local/ffmpeg-static/lib/libavcodec.a;\
/usr/local/ffmpeg-static/lib/libavformat.a;\
/usr/local/ffmpeg-static/lib/libswscale.a;\
/usr/local/ffmpeg-static/lib/libavutil.a;\
/usr/local/ffmpeg-static/lib/libavfilter.a;\
/usr/local/ffmpeg-static/lib/libswresample.a" \
-D BUILD_SHARED_LIBS=OFF \
..

6. 确认环境变量的作用域

确保PKG_CONFIG_PATH在执行CMake前已正确设置,且作用域覆盖编译进程:

export PKG_CONFIG_PATH=/usr/local/ffmpeg/lib/pkgconfig:$PKG_CONFIG_PATH
# 之后再执行OpenCV的CMake配置命令

内容的提问来源于stack exchange,提问作者caiping Peng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:50:55