继续折腾LNK 2005错误

这次是因为要把一个很久的老项目改成使用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错误

时间: 2024-10-14 00:40:17

继续折腾LNK 2005错误的相关文章

LNK 2005 error 函数定义也是定义!!

百度知道网友的给力解释 那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c? [email protected]@3HA already defined in BBB.obj 基本上是围绕一个重复定义展开.然后这个错误可以派生出第四种错误细节,函数定义重复. 在.h中实现函数定义,必须要把定义放在类的声明空间中,不能新打开定义空间去实现函数.因为这样子在其他文件#include时,会有两个不同实现地址路径,当链接器去寻址时就会出

vs典型问题(转)

add/remove operation is read only 原因:这个时候只要关闭工程,删除ncb文件和suo文件,打开工程,待Intellisesnce update完毕后,添加消息响应代码. 代码不能设置断点 原因:是Release版本或者选中Require source files  to exactly match the original  version. vc2005如何添加虚函数 原因:比如给对话框类CDesktopCapDlg添加虚函数PreTranslateMessa

结对项目—地铁出行路线规划

结对项目—地铁出行路线规划 我的搭档:陈鸿超 14061216 https://github.com/ChengFR/PairProgramming_SubwayRoute- 会在十一期间发布新版本 结对编程体会: 结对编程的优点: 站在软件开发的角度,两个人共同面对同一台电脑进行开发,无论是效率还是软件质量都要超过一个人进行开发的情况. 对于还处于学习阶段的年轻软件开发者来说,结对编程是一个很好的互相学习的机会 结对编程时动力.责任感更强 结对编程的缺点: 对于我们来说,寻找两个人共同的时间进

《梦断代码》读后感 - 驱动,责任,交流,远虑

这三篇读后感原来发布在我自己申请的域名 yishan.cc 上面,后来这个域名被墙了. (原文写于2008年12月) 几个星期前,我给<现代软件工程>课的每一个团队都发了一本 <Dreaming In Code>的中文版 <梦断代码>,要求写读后感.这本书讲了这样的故事:一群很有经验的代码牛人在先进软件开发模式的指导下,没有资金压力,在更多大牛的带领下,原计划用一到两年的时间开发出一个备受期待的个人信息管理软件(PIM),后来花了七年时间才完成这一创举,但是已经无人喝彩

C++ 编译器的函数名修饰规则

C++ 编译器的函数名修饰规则 函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型.LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置. 多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们.当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中, 为了让LINK程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如

Sql-Server 配置远程连接以及C#连接字符串

SQL Server 2008默认是不允许远程连接的,sa帐户默认禁用的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置: 使用用sa账户登录SQL Server Management Studio(简写SSMS) 如果安装时,不是使用SQL Server身份验证模式的,请使用windows身份连接数据库,登录后,右键选择“属性” “安全性”,选中右侧的“SQL Server 和 Windows 身份验证模式”以启用混合登录模式 选择“连接”,勾选

新浪微博开发获取access_token的艰难过程

一个网络问题困扰了我好几天,终于幸运的解决了. 言归正传,笔者按照M了个J的教程来进行新浪的开发,到抓取微博数据的时候挂了,一直无法读取微博接口,现在仍没解决,不过我新建了一个应用,用自己的账号调试通过了.接下来说说遇到的几个坑. 网络用的AFN框架,开发环境Xcode5,ARC.最开始一直按照MJ的做法用response_type=token来获取,一直挂,万念俱灰.后Google到有人说这个方式被新浪用来只开放给web了,客户端没戏,尝试着获取code,然后再用code获取access_to

sqlserver相关问题

解决方案 用户 'sa' 登录失败.该用户与可信 SQL Server 连接无关联 问题一.忘记了登录Microsoft SQL Server 2005 的sa的登录密码 解决方法:先用windows身份验证的方式登录进去,然后在‘安全性’-‘登录’-右键单击‘sa’-‘属性’,修改密码(sa的密码不能太简单,最好要有数字,字母,下划线字符组成,且长度最好大于10个字符):点击确定就可以了. 问题二.已成功与服务器建立连接,但是在登录过程中发生错取.(provider:共享内存提供程序,erro

[转][C/C++]函数名字修饰(Decorated&#160;Name)方式

函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型.LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置.多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们.当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中,为了让LINK程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰.另一种需要指定函数的名字修饰的情况是在汇编程序中调用