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
相关产品推荐
相关产品推荐

