未定义的avcodec_alloc_context参考但ffmpeg链接器顺序是否正确?

时间:2014-07-22 10:22:03

标签: c++ ffmpeg static-linking libavcodec libavformat

我想构建静态链接到libavcodec和libavformat的静态链接可执行文件。 静态ffmpeg库是使用:

构建的
./configure --enable-static --enable-gpl --enable-nonfree --disable-vaapi 
     --disable-libopus --prefix=myBuild --disable-swresample

连接符的设置如下:

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
     -L/ffmpeg/myBuild/lib -lavformat -lavcodec -lavutil  -lrt -lm -lpthread -lz

编译时,我得到 仅一个 错误消息>: - /

src/ffmpeg/myProgram.cpp:115: error: undefined reference to 'avcodec_alloc_context'

输出nm /ffmpeg/myBuild/lib/libavcodec.a | grep avcodec_alloc_context:

         U avcodec_alloc_context3
         U avcodec_alloc_context3
000003c0 T avcodec_alloc_context3
         U avcodec_alloc_context3

我包括libavcodec.h和extern" C" {}我相信我的静态链接器顺序是正确的。为什么我会收到此错误?是因为这个方法已被弃用了吗?我该如何解决这个问题?

解决方案:

不要使用

avCtx = avcodec_alloc_context()

可能是较旧的代码段,但请使用

codec = avcodec_find_decoder(CODEC_ID_XYZ);//for completeness but should be the same as before
avCtx = avcodec_alloc_context3(codec)

2 个答案:

答案 0 :(得分:6)

您是否尝试过调用avcodec_alloc_context3?

我遇到没有问题调用avcodec_alloc_context3,分配extradata然后调用avcodec_open2。

链接顺序也应该是-lavutil -lavformat -lavcodec

答案 1 :(得分:2)

如果我没记错的话,我们也遇到了问题,解决方法是你必须专门将libavcodec.a(连同完整路径)和其他ffmpeg静态库添加到g ++链接步骤。看看它是否有效。

此外,库的顺序很重要。我不再拥有旧的makefiels了,但也许还记得libavutil应该是列表中的第一个。

所以你的链接命令应该是这样的:

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
 /ffmpeg/myBuild/lib/libavutil.a 
 /ffmpeg/myBuild/lib/libavformat.a 
 /ffmpeg/myBuild/lib/libavcodec.a 
  -lrt -lm -lpthread -lz