最近做了一个代码从VS2003升级到VS2005的工作,出现了不少问题,在参考了一些网上的资料和朋友的帮助后,再加上自己的分析调查,到目前为止出现的问题都解决了。由于发现网上这方面的资料似乎比较零散,为了使同样要做VS2003(或VC6)程序向VS2005(或VS2008)转化的朋友能够少走一点弯路,打算集中整理一下,分几回贴出。也欢迎各位网友提出宝贵意见或建议。(注意:由于VC6和VS2003比较贴近,VS2005和VS2008比较贴近,大多数问题及对策,也适用于VC6->VS2005/VS2008的升级)
1 常见的编译错误
1.1 定义变量的作用域问题,在VS2005下可能会报一种变量没有定义的错误,比如:
在VS2003下,如下猪头代码竟然能编译通过的,
for(int i=0;i<100;i++)
{
……
}
for(i=0;i<100;i++)
{
……
}
在VS2005则会报错,解决方法相信各位都会,不赘述。
1.2 在V2003下,函数的返回值类型或变量类型可以缺省(为int),在VS2005下,则必须明确定义。
1.3 VS2005下,MFC消息处理函数,例如ON_WM_NCHITTEST的返回值需要由UINT改成LRESULT
1.4 无参数的函数调用,V2003下可以不带括号,V2005下需要带上括号;
1.5 V2005下, STL迭代器不能赋值为NULL,也不能和NULL做比较,因为STL已经不能有NULL迭代器这么一说了。(关于迭代器的其他问题,以后还会进行特别说明)
1.6 V2003下,结构体的默认运算符==或者<之类的如果不实现也可以作为STL元素放入list等容器中。但在V2005下不行了,因为它已经不再为结构体生成缺省的操作符函数。
2 常见的链接错误
2.1 症状:VS2005下,显示fatal error LNK1104: 无法打开文件“LIBC.lib”
对策:项目->属性中->配置属性->链接器->输入->在忽略特定库中写入打不开的文件的名称LIBC.lib。
2.2 症状:VS2005下,显示MSVCRTD.lib(MSVCR90D.dll) : error LNK2005
对策:项目->属性中->配置属性->链接器->输入->在忽略特定库中写入MSVCRTD.lib(for Debug)/ MSVCRT.lib(for Release)。
2.3 症状:unresolved external symbol __iob
对策:在.cpp(如:stdafx.cpp)文件中追加extern "C" { FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]}; }
2.4 VS2005下所有工程属性中的C++ Language wchar_t 都要设置为一致,从VS2003升级过来的话,建议设置为”NO”,因为VS2003的default值就是它。
2.5 VS2005下所有工程的多线程dll设置选项应该保持一致,比如统一设置为:/MD(for Release)和/MDd(for Debug)。
2.6 如果使用了DirectShow 9.0,在VS2005下编译例子BaseClasses会有错,对策:
2.6.1 在Ctlutil.h中做如下修改:
修改前:operator=(LONG);
修改后:COARefTime& operator=(LONG);
2.6.2 在Winnt.h中的“typedef void * POINTER_64 PVOID64;”前面追加一行“#define POINTER_64 __ptr64”。或者在DXSDK自己的basetsd.h里自己定义#define POINTER_64 __ptr64
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dhm2000/archive/2009/11/20/4842149.aspx
>> 本文固定链接: http://www.vcgood.com/archives/3669