这两天编译一个VC工程的时候出现了LNK2019错误,费了一番力气解决了问题,在此做一个总结。
LNK2019错误属于链接错误,一般都会给出类似“在函数‘function’中引用了无法解析的外部符号‘symbol’”的错误提示,大部分都是由于引用了未定义的外部变量或函数,或者引用方式与声明的不匹配造成的。
引起LNK2019错误的具体原因有很多种,包括引用的“extern”变量没有定义,没有正确加载引用的库文件等。但是如果你确定没有犯这些比较低级的错误,还是出现了LNK2019,那么极有可能是因为引用库的编译环境与应用环境有不匹配的选项引起的,这个时候你就要根据错误提示信息定位引起错误的第三方库,然后仔细查找不匹配的因素。
以下这两篇文章相信会对大家有所帮助:
MSDN:链接器工具错误 LNK2019
C++连接器工具错误:LNK2001,LNK2019
再来说我碰到的问题。我拿到的是一个第三方库的demo示例程序,但是这个程序是在VC6环境下给出的。我的机器上没有VC6,所以试着将代码升级到了VC2008。编译程序就出现了LNK2019错误,根据提示信息定位问题出在demo中引用的他们自己的库文件。我可以确保工程环境中引用lib文件的设置是正确的,所以可以断定是因为升级以后的代码编译环境与引用库的编译环境有不匹配项引起的。
经过一番查找,发现是“/Zc:wchar_t”这个编译选项引起的,该选项设置是否将wchar_t视为内置的数据类型(具体请参考MSDN)。在VC6中,Setting of the project in "C/C++ -> Language -> Treat wchar_t as Built-In Type"项默认为No;而在VC2003以上版本中,项目属性“C\C++”->“Language”->“Treat wchar_t as Built-In Type”项默认为Yes。因此,只需要改变VC2008该项的设置为No即可。