g++的编译问题

compilation problem with g++

本文关键字:问题 编译 g++      更新时间:2023-10-16

我正在尝试运行一个使用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中可用。等,我已经指定了链接选项。谁能告诉我这里可能有什么问题或建议如何接近调试这个?

这是您自己的程序,而不是libav标准示例吗?我可能是错的,但如果是这样,你可能会忘记指定extern "C",而包括libav头:

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

这可能是问题,因为你试图用c++编译器编译源代码,libav (ffmpeg)是用C编译器编译的,所以你必须标记包含库的头,由C编译器使用extern C编译。

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

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

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