近期,因为工作的需要,要把一个在VC6.0下开发的项目整体迁移到VS2010下面去,这个工程已经创建并更新维护差不多十多年的时间了,经手人数不胜数,里面的东西更是千奇百怪,想到这些就头皮发麻,不过,工作嘛,该做还是要做的。
果然,用2010打开了dsw文件后,重新编译时,提示出了无数的错误与异常,看的头皮发麻,只能耐下心来,仔细分析,逐个修改,发现基本就以下8大类型的错误。
fatal error C1083: 无法打开包括文件:“”: No such file or directory
修改方法:将#include "" 修改为
#include <fstream>
using namespace std;
error C2440: “static_cast”: 无法从“LRESULT (__thiscall CGpsView::* )(WPARAM,LPARAM)”转换为“AFX_PMSG”,在匹配目标类型的范围内没有具有该名称的函数
error C2440: “static_cast”: 无法从“void (__thiscall CGpsView::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”, 在匹配目标类型的范围内没有具有该名称的函数
解决方法:vs2010下对函数的结构要求比较严格,On_MEssage类型函数, 返回类型为LRESULT,要有参数和返回值 WPARAM,LPARAM;ON_COMMAND 类型函数,返回类型为 void, 且不能有参数,因此,第一个Error把 ON_COMMAND 改为 On_MEssage 就可以了;第二个把返回值类型改为 LRESULT即可。
error C2664: “IsInTimeCode”: 不能将参数 1 从“CTimeCodesList *”转换为“const CTimeCodesList *&” 转换丢失限定符。
解决方法:比较简单,强制类型转换即可,CTimeCodesList *pTimeCodesList; 改为 const CTimeCodesList *pTimeCodesList;
error C2065: “i”: 未声明的标识符
解决方法:变量作用域的问题,所以在for或if语句之前定义int i = 0 ;即可
verror C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
解决方法:在默认定义时,直接定义为int
error C2039: “WriteHuge”: 不是“CFile”的成员
解决方法:函数发生了变更,因此将ReadHuge()改为Read(),WriteHuge()改为Write()
error C2668: “pow”: 对重载函数的调用不明确
c:\program files (x86)\microsoft visual studio 10.0\vc\include\ma(583): 可能是“long double pow(long double,int)”
c:\program files (x86)\microsoft visual studio 10.0\vc\include\ma(535): 或 “float pow(float,int)”
c:\program files (x86)\microsoft visual studio 10.0\vc\include\ma(497): 或 “double pow(double,int)”
尝试匹配参数列表“(LONG, int)”时
解决方法:重载函数参数类型与定义不匹配,使用强制类型转换就可以了。
LIBCMT.lib) : error LNK2005: _sprintf 已经在 m) 中定义
LIBCMT.lib) : error LNK2005: __invoke_watson 已经在 m) 中定义
LIBCMT.lib) : error LNK2005: __invalid_parameter 已经在 m) 中定义
LIBCMT.lib) : error LNK2005: __vsnprintf_s 已经在 m) 中定义
解决方法:这个问题时默认库与其他库冲突,解决方法如下:
解决方法
配置属性-〉C/C++->代码生成 -〉运行时库,改为多线程/MD