程序员日志,将VC6.0下的项目整体迁移到VS2010,吐血解决方案

近期,因为工作的需要,要把一个在VC6.0下开发的项目整体迁移到VS2010下面去,这个工程已经创建并更新维护差不多十多年的时间了,经手人数不胜数,里面的东西更是千奇百怪,想到这些就头皮发麻,不过,工作嘛,该做还是要做的。

果然,用2010打开了dsw文件后,重新编译时,提示出了无数的错误与异常,看的头皮发麻,只能耐下心来,仔细分析,逐个修改,发现基本就以下8大类型的错误。

  1. fatal error C1083: 无法打开包括文件:“fstream.h”: No such file or directory

    修改方法:将#include "fstream.h" 修改为

    #include <fstream>

    using namespace std;

  2. 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即可。

  3. error C2664: “IsInTimeCode”: 不能将参数 1 从“CTimeCodesList *”转换为“const CTimeCodesList *&” 转换丢失限定符。

    解决方法:比较简单,强制类型转换即可,CTimeCodesList *pTimeCodesList; 改为 const CTimeCodesList *pTimeCodesList;

  4. error C2065: “i”: 未声明的标识符

    解决方法:变量作用域的问题,所以在for或if语句之前定义int i = 0 ;即可

  5. verror C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

    解决方法:在默认定义时,直接定义为int

  6. error C2039: “WriteHuge”: 不是“CFile”的成员

    解决方法:函数发生了变更,因此将ReadHuge()改为Read(),WriteHuge()改为Write()

  7. error C2668: “pow”: 对重载函数的调用不明确

    c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(583): 可能是“long double pow(long double,int)”

    c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(535): 或 “float pow(float,int)”

    c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(497): 或 “double pow(double,int)”

    尝试匹配参数列表“(LONG, int)”时

    解决方法:重载函数参数类型与定义不匹配,使用强制类型转换就可以了。

  8. LIBCMT.lib(sprintf.obj) : error LNK2005: _sprintf 已经在 msvcrtd.lib(MSVCR100D.dll) 中定义

    LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson 已经在 msvcrtd.lib(MSVCR100D.dll) 中定义

    LIBCMT.lib(invarg.obj) : error LNK2005: __invalid_parameter 已经在 msvcrtd.lib(MSVCR100D.dll) 中定义

LIBCMT.lib(vsnprnc.obj) : error LNK2005: __vsnprintf_s 已经在 msvcrtd.lib(MSVCR100D.dll) 中定义

解决方法:这个问题时默认库与其他库冲突,解决方法如下:

解决方法

配置属性-〉C/C++->代码生成 -〉运行时库,改为多线程/MD

举报
评论 0