`
dato0123
  • 浏览: 915648 次
文章分类
社区版块
存档分类
最新评论

从EVC4.0迁移到VS2005

 
阅读更多

//========================================================================
//TITLE:
// 从EVC4.0迁移到VS2005
//AUTHOR:
// norains
//DATE:
// Friday 21-December-2007
//Environment:
// EVC4.0 + Windows CE 5.0 Standard SDK
// EVC4.0 + SDK-WINCE5.0-MIPSII
// VS2005 + SDK-WINCE5.0-MIPSII
//========================================================================

微软在兼容性方面做得可谓极致,不需要太多的设置,便可从evc4.0工程可以平滑地升级到vs2005.

1.项目迁移
运行vs2005,点击菜单"File..."-->"Project/Solution..",选择evc的工程目录文件"*.vcp"和"*.vcw".在这里无论选择哪个文件都能顺利转换,但如果所迁移的evc工程中包含多个子工程,建议选择"*.vcw",这样可以保持原有的工程目录结构不丢失.确认文件选择之后,会出现警告对话框,提示转换是不可逆转的.不管它,直接点击"yes".迁移转换完毕,即可在vs2005中对原有工程进行编译.

这里有点要说明的是,虽然在转换过程中出现转换警告框,但其实vs2005并没有对evc4.0的工程文件做变动,所以转换之后你依然可以用evc4.0打开"*.vcw"或"*.vcp"进行编译.之所以会如此,是因为vs2005的工程后缀名为"*.sln",与evc的工程名不重合,所以可以和evc4.0工程共存.


2.SDK
如果在安装evc4.0之后安装了wince5.0的SDK,接着又安装vs2005,那么我们在vs2005中是无法看到所安装的SDK的.这时我们只需要重新运行SDK包安装程序,然后选择"Repair"进行修复. 修复完成之后,无论在evc4.0还是vs2005均可见到该SDK.


3.代码
由于vs2005与EVC4.0支持的C++标准不同,所以有些代码不一定两者都能兼容.
现在来举三个代码片段来说明:

1).vs2005编译通过,evc4.0无法编译通过.
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
for(int i = 0; i < 10 ; i++)
{}

for(int i = 0; i < 10 ; i++)
{}

return 0;
}

EVC编译时会提示错误:error C2374: 'i' : redefinition; multiple initialization.
导致两者差异的原因是两个编译器对变量i的生存周期理解不同.

2)vs2005无法编译通过,evc4.0编译通过.
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
unsigned short *usTemp = NULL;
wchar_t *wTemp = NULL;
wTemp = usTemp;
return 0;
}

vs2005编译时提示错误: error C2440: '=' : cannot convert from 'unsigned short *' to 'wchar_t *'
主要是因为两者编译对隐形形参转变的标准不同,虽然在MIPS架构中unsigned short和wchar_t都是双字节,vs2005也毫不留情认为这是错误的.如果遇到此类情况,可在vs2005中进行强制类型转换.

3)vs2005和evc4.0都能编译通过,但在运行时其中一个编译器编译出来的会有异常发生,另外一个却非常正常.
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
TCHAR szBuf[MAX_PATH] = {0};
#define STR_DEFTEXT("DEFINE App")
_tcscpy(szBuf,_tcslwr(STR_DEF));
}
如果选择的CPU为MIPSII类型,则该段代码由evc4.0编译后运行正常,但如果是由vs2005编译的程序,运行后则提示内存溢出异常.追根究底,这还是编译器实现的不同.从函数的定义来看,vs2005编译的程序出现异常才是正确的,而evc4.0编译后能正常运行完全是因为该版本的MIPSII编译器有bug,具体可参考我另一篇文章:《VS2005和EVC4字符串宏在MIPSII架构的比较》.


像上述所列的第一和第二种情况在编译的时候已经出现,所以不难找出问题根源并加以解决.最怕就是遇到第三种情况,虽然能编译通过,但在运行时总能给出意想不到的结果.遇到第三种情况,不妨换其它的编译器试试,说不定问题就出在编译器上.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics