gpt4 book ai didi

c++ - 包含从源代码编译的 ffmpeg 时从源代码编译 opencv 时出现链接错误

转载 作者:行者123 更新时间:2023-12-04 23:01:24 42 4
gpt4 key购买 nike

我已经被这个问题困住了好几个星期了。
我正在尝试在支持 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
然后构建它:
须藤使-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
这就是我得到链接错误的地方。
我 checkin /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

最佳答案

TL;DR:
我正在编译 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

关于c++ - 包含从源代码编译的 ffmpeg 时从源代码编译 opencv 时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69154917/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com