我想构建静态链接到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)
答案 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