这次是因为要把一个很久的老项目改成使用Unicode字符集,又一次遇到了LNK 2005错误
先说说怎么把老项目改成Unicode字符集吧,首先要有足够的信心能把项目改好,比如我这次改的项目,也不算很大,但是也有好几万行,一改成使用Unicode字符集编译后,瞬间出现上百个错误(VC2010碰到错误太多,超过一百个之后就会停止编译),不要看到数不清的错误之后就觉得改不好了,其实真正归纳起来需要改的就几种,改到最后只不过是体力活路问题,下面大概说一下,因为是事后写文,都是凭记忆,也许有遗漏的,如果有这方面需要的同学可以留言讨论。
在我改动的项目里面,CString和char *到处混杂使用(是MFC程序),我是这样改的:
1. 对于底层的函数绝对不要动,比如这样的:
int IntConnect(const char *user, const char *pass, const char *ip)
保证底层的函数依然用char *这样的形式,因为改动之后牵一发动全身,就没法改了,而且也没必要修改,怎么做看后面
2. 对于使用可随字符集变化的函数用_T()
CString CIni::GetString(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpDefault) const
在使用的时候记得对书面字符串用_T()宏来转换,
str = m_IniString.GetString(_T("*****"), _T("*****"), NULL);
3. 用W2A()和A2W()宏来转换CString和其他宽字节字符变量
举两个例子吧:
#ifdef _UNICODE
USES_CONVERSION;
strAuth = EncodeTextBase64(A2W(test));
#else
strAuth = EncodeTextBase64(test);
#endif
#ifdef _UNICODE
USES_CONVERSION;
strcpy(pchIP, W2A(strIP));
SetPassword(W2A(pchPassword));
#else
strcpy(pchIP, strIP);
SetPassword(pchPassword);
#endif
最后来说说LNK 2005错误,先拷贝一段内容:
http://zhanyonhu.blog.163.com/blog/static/16186044201023094754832/
原因:
CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。
当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误。
解决方法:
强制链接器按照正确的顺序链接库!
project->properties->Linker->Ignore Specific Library 添加 uafxcwd.lib Libcmtd.lib
在Additional Dependencied添加uafxcwd.lib Libcmtd.lib
注意,对于Debug和Release版本,还有动态和静态方式使用MFC,以及使用多线程库不同方式下,lib名称会稍有不同
我这里使用的是uafxcw.lib;Libcmt.lib
如果是使用多字节字符集编译的话,就是nafxcw.lib,如果是Debug版本的话,基本上为了区别,lib名称后面都会带一个d字母,比如Libcmtd.lib
大概就这些,有问题的话可以大家讨论下。
继续折腾LNK 2005错误