ffmpeg - 使用g ++编译问题

Sun*_*Sun 2 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
Run Code Online (Sandbox Code Playgroud)

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

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*)'
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*lov 8

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

extern "C"
{
#include <avcodec.h>
#include <avformat.h>
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是完成工作的答案!有点奇怪的是,默认情况下,使用 ifdef __cplusplus 宏,库不是“C++ 感知”的。这应该标记为已接受的答案,以便更好地突出显示。 (2认同)