明明在CMakeLists.txt配置了ffmpeg库,还是链接一直报错:
usr/bin/ld: video_processor/libvideo_processor_lib.a(video_processor.cpp.o): in function `VideoProcessor::run()':
video_processor.cpp:(.text+0x17db): undefined reference to `av_frame_free(AVFrame**)'
/usr/bin/ld: video_processor.cpp:(.text+0x1842): undefined reference to `av_frame_free(AVFrame**)'
/usr/bin/ld: video_processor.cpp:(.text+0x1856): undefined reference to `av_frame_free(AVFrame**)'
/usr/bin/ld: ffmpeg_handler/libffmpeg_handler_lib.a(ffmpeg_handler.cpp.o): in function `FFmpegHandler::cleanupReader()':
ffmpeg_handler.cpp:(.text+0x1b5): undefined reference to `avcodec_free_context(AVCodecContext**)'
/usr/bin/ld: ffmpeg_handler.cpp:(.text+0x1d9): undefined reference to `avformat_close_input(AVFormatContext**)'
/usr/bin/ld: ffmpeg_handler.cpp:(.text+0x201): undefined reference to `av_frame_free(AVFrame**)'
/usr/bin/ld: ffmpeg_handler.cpp:(.text+0x22a): undefined reference to `av_packet_free(AVPacket**)'
最可能的原因是库的链接顺序错误,按avformat → avcodec → swscale → avutil的顺序重新配置后,再检查头文件包含和函数调用参数,即可解决链接错误。
ffmpeg.cpp不能配置
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavcodec/packet.h>
#include <libswscale/swscale.h>
#include <libavutil/opt.h>
#include <libavutil/frame.h>
#include <libavutil/imgutils.h>
}
只能放在ffmpeg.h中