首页 > 解决方案 > 包含从源代码编译的 ffmpeg 时从源代码编译 opencv 时出现链接错误

问题描述

我已经被这个问题困住了好几个星期了。

我正在尝试在支持 x264 的树莓派 4 上构建 opencv。为此,我需要包含 ffmpeg,并从源代码构建它。

但是,在编译 opencv 时,我一直收到这些链接器错误:

/usr/bin/ld: ../../lib/libopencv_videoio.so.4.5.3: undefined reference to `avcodec_get_context_defaults3'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.5.3: undefined reference to `av_lockmgr_register'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.5.3: undefined reference to `av_register_all'

我是 Linux 新手,所以我不确定如何开始解决这个问题。我相信我已经正确编译和安装了 ffmpeg。

这是我使用的步骤:

配置ffmpeg:

sudo ./configure \
--prefix=/usr \
--extra-ldflags="-latomic" \
--enable-shared \
--extra-libs='-lpthread -lm' \
--ld=g++ \
--enable-gpl \
--disable-debug \
--enable-nonfree \
--enable-libx264 \
--enable-omx \
--enable-omx-rpi \
--enable-gnutls \
--enable-libfreetype \
--enable-libmp3lame

然后构建它: sudo make -j4

然后作为一个包安装它:(所以opencv cmake会检测到它)

sudo checkinstall -y --deldoc=yes --pkgversion=9999 --pkgname=ffmpeg

然后配置opencv(检测到ffmpeg)

sudo cmake ../opencv_sources -D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_EXTRA_MODULES_PATH= $PWD/../opencv_contrib/modules \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=ON \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D CMAKE_SHARED_LINKER_FLAGS='-latomic -L/usr/lib' \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D BUILD_EXAMPLES=OFF \
-D CPU_BASELINE=NATIVE \
-D CMAKE_INSTALL_PREFIX="$HOME/opencv_build" \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_SHARED_LIBS=ON \
-D WITH_FFMPEG=ON

然后构建opencv:

sudo make -j4

这就是我得到链接错误的地方。

我签入 /usr/lib 并且 .so 文件似乎在那里:

ls /usr/lib | grep libav

libavcodec.a
libavcodec.so
libavcodec.so.59
libavcodec.so.59.4.101
libavdevice.a
libavdevice.so
libavdevice.so.59
libavdevice.so.59.0.100
libavfilter.a
libavfilter.so
libavfilter.so.8
libavfilter.so.8.1.103
libavformat.a
libavformat.so
libavformat.so.59
libavformat.so.59.4.101
libavutil.a
libavutil.so
libavutil.so.57
libavutil.so.57.3.100

链接时如何检查opencv在哪里?有没有一种方法可以检查 ffmpeg 生成的共享库以确保它们正常工作?

ffmpeg 版本为:git-2021-08-10-c245963

而opencv是4.5.3-dev

标签: c++opencvffmpegraspberry-piraspbian

解决方案


TL;博士:

我正在编译 ffmpeg 的 master 分支。这个版本删除了一些不推荐使用的功能,并且与我的 opencv 版本不兼容。或者至少构建测试失败了。通过切换到 release/4.4 分支并重复我之前的构建步骤,我能够成功构建 opencv。

细节:

我能够确定这不是链接问题。我编写了一个简短的程序,它调用 avcodec_get_context_defaults3(...) 以及 avcodec_version(),这是另一个应该包含在其中的函数。在链接 libavcodec.so 时,找到了 avcodec_version(),但没有找到 avcodec_get_context_defaults3()。因此我认为这是 ffmpeg 和 opencv 之间的版本兼容性问题。

然后我确认该功能已从 ffmpeg 中删除。最新版没有,旧版有。我使用了 git 的搜索功能,发现了这个提交:

Author: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Date:   Thu Feb 25 20:37:24 2021 +0100

    avcodec: Remove deprecated avcodec_get_context_defaults3

    Deprecated in 04fc8e24a091ed1d77d7a3c0cbcfe60baec19a9f.

    Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
    Signed-off-by: James Almer <jamrial@gmail.com>

我切换到 FFMPEG 的 release/3.4 分支并重复这些步骤。但这缺少其他一些东西。我在 release/4.4 中第三次重复了这些步骤,并且成功了。

我用来下载正确分支的命令是这样的:

sudo git clone https://github.com/FFmpeg/FFmpeg --branch release/4.4 --depth 1 ffmpeg_sources

推荐阅读