在编译FFmpeg相关项目时。可能会出现:
error LNK2019: 无法解析的外部符号 "int __cdecl avpicture_fill(struct AVPicture *,unsigned char const *,enum AVPixelFormat,int,int)" (?avpicture_fill@@YAHPAUAVPicture@@PBEW4AVPixelFormat@@HH@Z),该符号在函数 "bool __cdecl YV12ToBGR24_FFmpeg(unsigned char *,unsigned char *,int,int)" (?YV12ToBGR24_FFmpeg@@YA_NPAE0HH@Z) 中被引用
error LNK2019: 无法解析的外部符号 "void __cdecl sws_freeContext(struct SwsContext *)" (?sws_freeContext@@YAXPAUSwsContext@@@Z),该符号在函数 "bool __cdecl YV12ToBGR24_FFmpeg(unsigned char *,unsigned char *,int,int)" (?YV12ToBGR24_FFmpeg@@YA_NPAE0HH@Z) 中被引用
这样的相似情况,在检查包括文件夹、库文件夹、链接器输入和系统环境变量均设置无误的情况下,包括的文件要写成下面形式:
extern "C"
{
#include <libavcodecavcodec.h>
#include <libavformatavformat.h>
#include <libswscaleswscale.h>
#include <libavutilpixfmt.h>
#include <libavutilimgutils.h>
};
这样的情况是由于,头文件里的函数定义在编译为 C 程序的文件里。而头文件是在 C++ 文件里不带 extern “C” 修饰符声明的。
在此情况下,须要加入extern "C"
修饰符。
相似的,定义在编译为 C 程序的文件里的符号, 若要在C++ 文件里进行声明,不可使用:
extern int i;
extern void g();
而应该使用:
extern "C" int i;
extern "C" void g();
具体的解释:http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html