代码从VS2003升级到VS2005的编译链接问题及解决方法

来源:互联网 发布:mac剪切快捷键 编辑:程序博客网 时间:2024/05/01 01:10

 

最近做了一个代码从VS2003升级到VS2005的工作,出现了不少问题,在参考了一些网上的资料和朋友的帮助后,再加上自己的分析调查,到目前为止出现的问题都解决了。由于发现网上这方面的资料似乎比较零散,为了使同样要做VS2003(或VC6)程序向VS2005(或VS2008)转化的朋友能够少走一点弯路,整理如下也欢迎各位网友提出宝贵意见或建议。(注意:由于VC6和VS2003比较贴近,VS2005和VS2008比较贴近,大多数问题及对策,也适用于VC6->VS2005/VS2008的升级)

 

1         常见的编译错误

1.1        定义变量的作用域问题,在VS2005下可能会报一种变量没有定义的错误,比如:

VS2003下,如下猪头代码竟然能编译通过的,

for(int i=0;i<100i++)

{

          ……

}

for(i=0;i<100i++)

{

          ……

}

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.libfor Debug/ MSVCRT.libfor 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”,因为VS2003default值就是它。

2.5        VS2005下所有工程的多线程dll设置选项应该保持一致,比如统一设置为:/MDfor Release)和/MDdfor 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

 

 

原创粉丝点击