1. lnk2019
LNK2019错误一般是 compile 能找到 header(.h)文件,但是在链接时找不到需要的 lib 库文件或者是 dll 文件。
一般认为在编译 OSG 简单示例的时候遇到这样的错误是因为错误的设置了 lib2。OSG 的 lib 目录中一般有两组文件名相似的 lib 文件,其中一组以 d 结尾,例如:osgDBd.lib, osgViewerd.lib,这个表示该 lib 是用于调试 debug,而不带 d 的一组是用于 release 版本。
如果没有正确的指定 lib 文件,那么一般会出现 error LNK2019 错误。比如,编译时指定的是 debug, 但是依赖项设置的却是不带 d 的那一组 release 版本的 lib 文件;或者是编译时指定 debug,但是依赖项设置的是带 d 的一组。只要编译的选项和调用的 lib 一致即可解决这个问题。
不过我仔细检查了自己调用的 lib,编译的选项和调用的 lib 都是 debug 版本的。
后来发现,开发机器是64位的,而编译选项的目标平台(platform)选择的却是 win32,修改为 x64 之后解决了这个链接错误。
也看到有人说1,前面函数声明与后面的函数定义参数类型不同时,有时 compile 能够通过,但是 link 的时候会出现 error LNK2019 错误。
参考链接:
- error LNK2019: unresolved external symbol
- 求助:最简单的OSG例子编译出错
- error LNK2019: unresolved external symbol "__declspec(dllimport)
2. lnk2001
一般来说,我们引用第三方库时,需要进行指定依赖项配置,若没有进行相关配置,则编译器会出现“LNK2001:无法解析的外部符号”错误。 (与LNK2019有区别:LNK2019是配置错了,而这里是没有找到)
这个是最常见的问题,具体步骤:
项目->属性->链接器->常规->附加库目录:填写附加依赖库所在目录(分号间隔多项);
项目->属性->链接器->输入->附加依赖项:填写附加依赖库的名字.lib空格或分号间隔多项
若已经按照上述步骤进行配置,但编译器还是报错,可能情况如下:
1.编译lib库和引用lib库平台不一致
lib库采用的编译平台和引用该lib的工程的编译平台不兼容导致的。比如项目采用vs2008编译,而该lib式采用2010编译的,亦或者项目采用vs2015平台,而lib是vs2008编译的也可能导致链接失败。
2.编译lib库和引用lib库选项不一致情况
1) 一个lib库采用“多线程 DLL (/MD)”配置,而另外一个项目采用“多线程(/MT)”编译配置
2) 一个lib库采用“使用 Unicode 字符集”配置,而另外一个项目采用“使用多字节字符集”编译配置
3) 一个lib库采用选择“release 版本 ”配置,而另外一个项目采用选择 “debug 版本 ”编译配置
4) 一个lib库采用“wind32平台 ”配置,而另外一个项目采用“wind64平台 ”编译配置
3.没有添加指定预编译宏
在使用curl静态库时,却遇到了编译链接错误:
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_init
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_setopt
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_perform
1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_cleanup
解决方法是,在自己的项目属性中添加一个预编译宏,CURL_STATICLIB,
4.如果上述3点都没能解决这个问题,则把源文件添加进工程,这是迫不得已之法,但也是最根本的解决之道!
为了避免遇到以上问题,建议:
1)引用第三方库时,确认lib库是否使用相同编译平台
2)确认编译选项是否一致,比如运行时库和字符集
3)若需要则添加指定编译宏
4)添加附加库目录和附加依赖项
参考链接:
https://blog.csdn.net/c_base_jin/article/details/83010745
3. error C2001: newline in constant
这个错误开发中难免会遇到
一是可能由于疏忽可能括号、引号等不匹配造成;
二是由于编码方式引起,解决:由于包含汉子,将其文本编码改为utf8.或者 将源码文件用其它编辑器打开,保存为utf8+bom编码格式。
注意:有时有的中文标点同样会报错。
参考链接:
https://blog.csdn.net/allen807733144/article/details/85243819