利用class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpeg实现一个播放器c;class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpeg提供动态库c;但是编译链接的时候遇到下面的问题:
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:23: error: undefined reference to 'sws_freeContext(SwsContext*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:28: error: undefined reference to 'av_frame_free(AVFrame**)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:33: error: undefined reference to 'av_frame_free(AVFrame**)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:38: error: undefined reference to 'avcodec_close(AVCodecContext*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:39: error: undefined reference to 'avcodec_free_context(AVCodecContext**)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:44: error: undefined reference to 'avformat_close_input(AVFormatContext**)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:55: error: undefined reference to 'avformat_network_init()'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:58: error: undefined reference to 'avformat_open_input(AVFormatContext**, char const*, AVInputFormat const*, AVDictionary**)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:64: error: undefined reference to 'avformat_find_stream_info(AVFormatContext*, AVDictionary**)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:84: error: undefined reference to 'avcodec_find_decoder(AVCodecID)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:91: error: undefined reference to 'avcodec_alloc_context3(AVCodec const*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:98: error: undefined reference to 'avcodec_parameters_to_context(AVCodecContext*, AVCodecParameters const*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:104: error: undefined reference to 'avcodec_open2(AVCodecContext*, AVCodec const*, AVDictionary**)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:110: error: undefined reference to 'av_frame_alloc()'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:117: error: undefined reference to 'av_frame_alloc()'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:124: error: undefined reference to 'av_image_get_buffer_size(AVPixelFormat, int, int, int)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:125: error: undefined reference to 'av_malloc(unsigned long)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:128: error: undefined reference to 'av_image_fill_arrays(unsigned char**, int*, unsigned char const*, AVPixelFormat, int, int, int)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:131: error: undefined reference to 'sws_getContext(int, int, AVPixelFormat, int, int, AVPixelFormat, int, SwsFilter*, SwsFilter*, double const*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:148: error: undefined reference to 'av_read_frame(AVFormatContext*, AVPacket*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:151: error: undefined reference to 'avcodec_send_packet(AVCodecContext*, AVPacket const*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:157: error: undefined reference to 'avcodec_receive_frame(AVCodecContext*, AVFrame*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:164: error: undefined reference to 'sws_scale(SwsContext*, unsigned char const* const*, int const*, int, int, unsigned char* const*, int const*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:170: error: undefined reference to 'av_frame_unref(AVFrame*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:174: error: undefined reference to 'av_packet_unref(AVPacket*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:187: error: undefined reference to 'sws_freeContext(SwsContext*)'
../class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer/videoplayerwidget.cpp:188: error: undefined reference to 'sws_getContext(int, int, AVPixelFormat, int, int, AVPixelFormat, int, SwsFilter*, SwsFilter*, double const*)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:288: class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer] Error 1
10:29:50: 进程"/usr/bin/make"退出c;退出代码 2 。
Error while building/deploying project class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpegWidgetPlayer (kit: Desktop Qt 5.15.2 GCC 64bit)
When executing step "Make"
10:29:50: Elapsed time: 00:03.
通过分析报错信息可以看到在链接阶段提示class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpeg相关的api找不到符号c;看到这个问题百思不得其解c;该工程我是利用qt编译链接c;可以肯定的是pro文件中已经通过LIBS关键字指明了依赖库的路径和依赖库的名称c;但是仍然提示找不到c;最后通过查阅资料c;才了解问题产生的原因:color:#fe2c24;">qt工程是c++代码c;class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpeg是c原因编写的c;当c++代码调用C库时对c++代码中调用的头文件需要使用extern "C"包含起来c;以此让编译器按照C的方式编译class="tags" href="/tags/FFMPEG.html" title=ffmpeg>ffmpeg相关的头文件。
解决方法如下:
<code class="language-cpp">#include <QWidget> #include <QImage> #include <QTimer> #include <QPainter> #include <QCoreApplication> #include <QResizeEvent> extern "C" //按照C语言方式编译api接口 { #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h> #include <libavutil/avutil.h> #include <libpostproc/postprocess.h> #include <libavutil/ffversion.h> #include <libavutil/imgutils.h> }code>