Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案

一、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"
}

 

posted @ 2019-07-03 15:55  灰色飘零  阅读(1519)  评论(0编辑  收藏  举报