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

  1. Navicat for MYSQL 断网时本地连接无法打开,2005错误

    Navicat for MYSQL 断网时本地连接无法打开,2005错误 NO1 提示下图: NO2 解决方法: (1)选中本地连接,右键 连接属性 (2) 将 主机名或IP地址 这一栏改为 127. ...

  2. C++编译错误 --- 成员函数定义在 .h 文件中出现重定义错误(Error LNK 2005)

    今天写了一个简单的类,定义在 .h 文件中, 类很简单就将其成员函数定义在了一起(class类后面).运行的时候出现了如下图所示的编译错误(error LNK2005) 查资料,大部分都是说需要加上 ...

  3. SQL SERVER 2005 错误:18456

    安装好SQL SERVER 2005之后,Windows身份验证无法登陆,出现18456错误.而sql server 身份验证可以用sa用户登陆. 解决办法: 用sa用户登陆,执行SQL 语句: CR ...

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

    url=Ccne-rWwUO9tJp5YAPcycUw09__2whgZLpLw2aWVuYuE-fhu46kaVNX4BldWlsxig1tDML47aO_ctD3PcUlGjK"> ...

  5. Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决

    最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...

  6. phpmyadmin登录提示2005错误

    请修改phpMyAdmin\libraries\config.default.php 把 $cfg['Servers'][$i]['host'] 改成127.0.0.1

  7. visual studio 引用lib

    方法1: 要具有lib文件和.h文件 1.加入语句 #pragma comment(lib, 'C:\\test\\Debug\\test.lib' 2.项目右键-〉属性-〉c++ -〉常规-〉附加包 ...

  8. mtk刷机错误汇总

    MTK常见错误解读与解决方法: 1.刷机过了红条,到了紫色条卡住.(错误代码4008) 解决方法:这种情况出现的话,大家可以把电池拿下来,然后重新安装上,进入REC后选择关机.然后重新刷. 2.驱动安 ...

  9. Linux 夸平台 移植 Win32

    1.代码格式 大量的 警告 不识别的字符(936),请保存为unicode 以免丢失数据,好多参考说忽略此警告. 但是很多错误都是由于这个警告引起的.将大量的.h .cpp 的utf 8 数据用txt ...

随机推荐

  1. Java升级替换java version "1.5.0"

    首先进行java安装 http://www.cnblogs.com/someone9/p/8670585.html 2. 然后查看版本信息,仍然是1.5.0 [root@OKC java]# java ...

  2. my21_myloader -o参数

    -o 参数 如果不使用-o参数,遇到第一个有主键或者唯一约束的数据,则退出当前线程:如果有-o参数,则删除原来的表,创建新表,再插入数据,主键不会发生变化. ** Message: Dropping ...

  3. 如何在eclipse使用git插件

    how to commit file to remote? --> Team --> Synchronize Workspace --> add to index --> co ...

  4. android Activity启动过程(一)从startActivty开始说起

    从启动startActivity开始说起 MainActivity.startActivity() Activity.startActivity() Activity.startActivityFor ...

  5. Spring Cloud学习笔记之微服务架构

    目录 什么是微服务 架构优点 架构的挑战 设计原则 什么是微服务     微服务构架方法是以开发一种小型服务的方式,来开发一个独立的应用系统的.     其中每个小型服务都运行在自己的进程中,并经常采 ...

  6. oracle 找回被覆盖的存储过程

    登录到sys账户下 1.TO_TIMESTAMP('2014-05-04 14:33:00', 'YYYY-MM-DD HH24:MI:SS') 删除前的日期 2.owner 表空调 3.Name   ...

  7. Win2D 官方文章系列翻译 - 像素格式

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-pixel-formats/ DirectXPixelFormat 枚举 包含了 Direct3D 和 DXG ...

  8. 微信公众号自动回复_Java

    先声明一下,这是一个maven工程pom文件需要的依赖: <dependency> <groupId>dom4j</groupId> <artifactId& ...

  9. kafka存储机制以及offset

    1.前言 一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一.下面将从Kafka文件存储机制和物理结构角度,分析Kafka是如何实现高效文件存储,及实际应用 ...

  10. tomcat多站点部署

    我们可能会有这种场景,一个tomcat想部署两个web工程,说白了就是公用一个端口,那怎么办呢?就是多站点部署,具体步骤如下(这里以linux平台举例): 1)先修改server.xml(conf/s ...