c++ - FFmpeg 好像是版本冲突

标签 c++ compilation ffmpeg

我正在使用 ffmpeg 的 git 版本(旧版本成功使用后更新),当我尝试编译我的项目时,我得到

 /usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_subpacket':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:376: undefined reference to `swr_is_initialized'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_frame':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:222: undefined reference to `swr_is_initialized'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_init_resample':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:163: undefined reference to `swr_init'
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:169: undefined reference to `swr_convert'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_frame':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:236: undefined reference to `swr_convert'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_flush_resample':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:117: undefined reference to `swr_convert'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_subpacket':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:408: undefined reference to `swr_close'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_flush':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:557: undefined reference to `swr_close'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_close':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:579: undefined reference to `swr_free'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_init':
/home/user/projects/ffmpleglast/ffmpeg/libavcodec/opusdec.c:629: undefined reference to `swr_alloc'

好像是版本冲突?但如何删除错误的库呢?它们似乎是今天的版本。

ls -l /usr/local/lib
-rw-r--r-- 1 root root  136509684 may   29 14:47 libavcodec.a
-rw-r--r-- 1 root root    1853574 may   29 14:47 libavdevice.a
-rw-r--r-- 1 root root    9689456 may   29 14:47 libavfilter.a
-rw-r--r-- 1 root root   46282270 may   29 14:47 libavformat.a
-rw-r--r-- 1 root root    2092250 may   29 14:47 libavutil.a
-rw-r--r-- 1 root root      67942 may   12 11:29 libBasicUsageEnvironment.a
-rw-r--r-- 1 root root    2200164 apr.  10 10:11 libfftw3.a
-rwxr-xr-x 1 root root        872 apr.  10 10:11 libfftw3.la
-rw-r--r-- 1 root root      94188 may   12 11:29 libgroupsock.a
-rw-r--r-- 1 root root    2236084 may   12 11:29 libliveMedia.a
-rw-r--r-- 1 root root     546506 may   29 14:47 libswresample.a
-rw-r--r-- 1 root root    4813716 may   29 14:47 libswscale.a
-rw-r--r-- 1 root root      14588 may   12 11:29 libUsageEnvironment.a

最佳答案

当我构建一个试图引入 ffmpeg DLL 的 DLL 时,我遇到了同样类型的错误。

我缺少 ffmpeg 包含文件周围的 extern C 语句:

extern "C"
{
#include "include\libavcodec\avcodec.h"
#include "include\libavformat\avformat.h"
#include "include\libavformat\avio.h"
#include "include\libswscale\swscale.h"
#include "include\libavutil\dict.h"
#include "include\libavutil\frame.h"
}

我还发现我需要将 DLL 作为依赖项添加到解决方案中,或使用 pragma 语句将其包含在内。

#pragma comment(lib, "..\\..\\..\\..\\contrib\\ffmpeg\\lib\\avformat.lib")
#pragma comment(lib, "..\\..\\..\\..\\contrib\\ffmpeg\\lib\\swscale.lib")
#pragma comment(lib, "..\\..\\..\\..\\contrib\\ffmpeg\\lib\\avutil.lib")

这是在 Windows 上,只是告诉 VS 指定的 lib 文件详细说明了相同位置中 DLL 的接口(interface)。在 Linux 上你不需要它,因为你的 -lavformat 等语句应该涵盖它,但我怀疑你可能需要 extern C 部分。

如果仍然没有帮助,也许在编译/链接上使用详细模式,这样您就可以看到来自哪些位置的内容。

关于c++ - FFmpeg 好像是版本冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932247/

相关文章:

python - 从 Cmake 的 find_program 中保存可执行文件,以便它可以由 Python 运行

c++ - 如何使用构造函数初始值设定项列表中的 n 个元素初始化 std::vector<std::time_t>

c++ - C++ 删除操作符如何找到多态对象的内存位置?

gcc - 尝试构建 GCC 后端时出现段错误

c - 循环优化差异

ffmpeg - 我的单行 ffmpeg 命令有误

c++ - 关闭一个窗口后如何防止Win32应用程序其他窗口变为非事件状态

audio - 如何从 PureTool/CVS 视频转换音频流?

python - 转换音频文件并返回

emacs - emacs * compilation *缓冲区中的换行