我正在尝试运行一个使用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等中可用,我已经使用链接选项指定了这些函数。 任何人都可以告诉我这里可能有什么问题或建议如何调试这个?
答案 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
中函数的引用,因此标志顺序已经正确。