ffmpeg - 使用g ++编译问题

时间:2011-09-22 11:47:54

标签: c++ ffmpeg

我正在尝试运行一个使用ffmpeg库来解码mp3文件的程序。我正在使用以下选项来编译程序:

g++ -c play.cpp -o play.o
g++ -o play play.o -L/usr/local/lib -lavutil -lavcodec -lavformat -lavdevice \
                   -lavfilter -ldl -lasound -L/usr/lib -lSDL -lpthread -lz -lswscale -lm

但是在链接时,我遇到了错误:

play.cpp:(.text+0x49): undefined reference to `av_dup_packet(AVPacket*)'
play.cpp:(.text+0x66): undefined reference to `av_malloc(unsigned int)'
play.cpp:(.text+0x324): undefined reference to `avcodec_decode_audio3(AVCodecContext*, short*, int*, AVPacket*)'
play.cpp:(.text+0x387): undefined reference to `av_free_packet(AVPacket*)'

依旧...... 这些报告的函数在libavcodec.a等中可用,我已经使用链接选项指定了这些函数。 任何人都可以告诉我这里可能有什么问题或建议如何调试这个?

2 个答案:

答案 0 :(得分:8)

这是您自己的程序,而不是libav标准示例吗?我可能错了,但如果是这样的话,你可能会忘记在包含libav标题时指定extern“C”:

extern "C"
{
#include <avcodec.h>
#include <avformat.h>
}

这可能是问题'因为您尝试使用C ++编译器编译源代码而libav(ffmpeg)是使用C编译器编译的,因此您必须使用extern C标记由C编译器编译的库的include头。

如果你已经将包含标记为extern C,请从你的程序中发布一些代码块来查看..

答案 1 :(得分:1)

您应该使用详细链接(-Wl,--verbose)确保选择了正确版本的-lavcodec,并使用objdump或ldd检查符号是否真正在库中。

您可以尝试切换-l标志的顺序,这些非常重要;但是,由于play.cpp包含对-lavcodec中函数的引用,因此标志顺序已经正确。