LNK2019、2001等问题总结

    今天编译一个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即可。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  在另一个情景中,在2008里新建的MFC app 工程首次编译链接也没有通过,出现的错误仍然是LNK2019,symbol则是__RTC_Check。在工程设置中几经寻找后才终于找到问题:在我的2008中,所谓的RTC check开关,也就是运行时检测,在工程->属性->C/C++->Code Generation中的Basic Run Time Checks,這個的开关有好几种种,分别是/RTCs、/RTCu,还有就是Both(两者都是)和默认(Default)。我的MFC工程中的初始设置所谓的默认(Default),而是Both= =。然后把这个开关改成真正的Default,就可以了。实测其他任何选项都只能编译不能链接。

  那么,这个开关是用来干嘛的呢?看這個。簡單的說,

  /RTCu 这个开关的作用是打开对未初始化变量的检查,比静态的警告要有用一些。

  /RTCs 这个开关是用来检查和Stack相关的问题:

  1. Debug模式下把Stack上的变量初始化为0xcc,检查未初始化的问题
  2. 检查数组变量的Overrun
  3. 检查ESP是否被毁坏 

  那么,在MFC工程中无法打开这些检测,意味着什么呢?

 

posted on 2015-01-20 14:52  Le0Bl0g  阅读(214)  评论(0)    收藏  举报

导航