一、Error LNK2019: 无法解析的外部符号
此问题应该是Visual Studio的初学者最常碰到的问题,也是相对来说很让人头疼的问题。
注:Error LNK2019 问题在VC 6.0 中是 error LNK2001: unresolved external symbol 问题。
此问题出现在编译的时候,例如:Dlgcode.obj : error LNK2019: 无法解析的外部符号 _readRegmark,该符号在函数 _AboutDlgProc@16 中被引用。
这种错误的本质是链接器无法在已编译的obj、lib或dll文件中找到函数定义。下面是可以尝试的解决方案:
1. 检查项目中是否是只有头文件(有了函数声明)却没有lib。一般出现于你使用了第三方提供的库(当然如果库是自己写的,也会这样,重点是没有导入lib),下载了头文件却忘了载库文件,或库文件忘记放到相应的目录下了。
2. 如果进行上面的检查后发现并没有问题,头文件没问题,cpp文件也没问题,相应的库都正常引入了,但是依旧出现LNK2019错误。此时我们就应该从代码层面去排查问题了。很有可能是C语言和C++语言混编导致的问题。因为C++支持函数重载,所以C++编译器生成的库文件中的函数名会面目全非。
例如C编译器会生成 _readRegmark 这个函数名,而C++编译器则生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)这么个函数名。
当你的函数是用C语言写的,VS编译器会按C语言规则编译,但链接器却不知道还傻傻的用C++规则的函数名去找结果就找不到了。
解决办法:在C语言的头文件中加入extern "C",代码方式如下:
extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
#include <libswresample/swresample.h>
#include "SDL.h"
}
|