VS常见错误之一:error LNK2019: 无法解析的外部符号
由于经常使用VS的开发环境,所以经常遇到一些错误提示,其中error LNK2019是很常见的一个报错。今天将此错误的原因和常见解决办法根据自己的经验小小总结一下。
问题样式:
1>SingleView.obj : error LNK2019: 无法解析的外部符号 __imp__wglCreateContext@4,该符号在函数 "protected: int __thiscall CSingleView::CreateViewGLContext(struct HDC__ *)" (? CreateViewGLContext@CSingleView@@IAEHPAUHDC__@@@Z) 中被引用
原因:找不到相应的库文件,即xx.lib文件。找不到库文件的原因可能有以下几种:
①你使用别人的库,比如说OPenCV的库,OpenGL的库等等第三方库。常见情况是你只是包含了头文件,但是没有引入库文件
②你没有使用别人的库,微软自带的一些库也可能出现这样的问题。这时常见情况是链接失败的函数所在的头文件在项目属性的包含目录下,但是相应的库文件却不在项目属性的默认库目录里。比如说常见问题
样式里的CreateViewGLContext(struct HDC__ *)函数就是这种情况,此函数在头文件wingdi.h里定义,这个头文件在项目属性中默认的包含目录下,但是对应的库文件opengl32.lib却不在库目录里
③你使用了自己做的库文件。这种情况自己没有试过,看过网上的一些说法
解决办法:核心是添加相应的库文件即可
对于情况①,有两种办法,一种是通常配置一下项目属性就好(在你相应开发环境配置好的前提下),在项目属性的库目录里面添加相应库文件所在的目录,然后在链接器->输入->附加依赖项里加入对应的库文件即可
第二种解决办法是利用预处理命令#pragma comment (lib, "xxx.lib"),关于这条命令的使用方法不是本文的主要目的,读者可参见网上其他博客。这样做的前提是所用的库目录在VS的默认库目录下或者库文件所在目录已经被添加到项目的库目录里或者相应的库文件已经被你拷贝到当前项目目录下,相当于是第一种方法的“代码化”版本
对于情况②,你只需要找到函数所在的库文件(通常按照函数名在网上搜即可找到函数所在的库文件),然后文件首部添加#pragma comment (lib, "xxx.lib")即可
对于情况③,因你使用方法不同,可参见情况一和情况二处理