将Visual C++ 6.0中的大型项目从Visual C++ 6.0迁移到Visual Studio 2005

问题描述:

我在Visual C++ 6.0中使用Visibroker(简称VB)维护一个大项目(〜250k loc,不包括idl生成的代码)。 1(这是Borland的CORBA实现)。最近,与我的项目进行通信的其他模块已升级到VB 8.0,并且遇到了一系列不兼容问题。由于VB 5.2.1不再支持,而VB 8.0不适用于Visual C++ 6.0,因此我正在考虑将整个项目迁移到Visual Studio 2005.它不是像total rewrite large C++ application in C#?那样的大变化,而只是解决了所有不兼容性错误。将Visual C++ 6.0中的大型项目从Visual C++ 6.0迁移到Visual Studio 2005

我的问题是我应该用什么样的策略来解决这个任务?任何人都曾经这样做过?另外,对我来说问题在于项目的规模。做这种迁移需要多少努力?

仅供参考,该项目在MFC中有一个前端GUI部分和一个后端CORBA部分。虽然这两者分离不是很好。

此致敬礼。

+2

在VS2005中打开项目。编译。看看什么击中粉丝。 – 2010-06-04 13:11:17

这将是多么困难将取决于代码编写的程度。如果项目具有良好的分层,并且CORBA的东西在库中很好地封装并且大部分其他应用程序逻辑不直接依赖它,那么它不应该太糟糕。如果CORBA调用遍布整个应用程序逻辑,那么它可能会更困难。但是这实际上取决于两个版本vb之间的兼容性问题的性质,我不熟悉具体问题。您会认为供应商会提供一些关于版本与迁移策略之间兼容性的文档。

理论上,您可以在新的IDE中打开旧项目并构建它。实际上,你将遇到两个问题 - 保存你的“这里是我所有的源文件和我的编译器选项”的元文件和你的实际代码:.dsp和.dsw,现在当.sln和.vproj。第一个可能需要你漫游6.0到7.0的升级过程到8.0,如果你不想或不能,你可能需要重建一个空的解决方案/项目并添加你的源文件到它并设置你的选择。

然后,您需要处理自上次构建以来库中的任何中断更改。我认为这可能是安全的CRT更改和for循环范围。编译器会为你找到它们。你不会很喜欢改变这一切,但这是可以预料的。

顺便说一下,我会一路走到VS2010,而不是到2005年。在很长的一段时间内购买自己,然后再做这件事。

+0

“顺便说一句,我会一路走到VS2010”+1 – anno 2010-06-04 13:29:38

+0

-1:有两个原因。理论上你应该能够打开新的IDE并进行编译,并不能反映从VC6移植到VC8的现实可能非常困难。此外,编译器会告诉你需要修复的所有内容的建议简直是错误的。就像你不能使用编译器告诉你什么是符合标准一样,你不能依赖编译器来在移植时发现所有的错误。移植的代码可能会编译,但仍不能按预期运行。您必须了解所有重大更改,而不仅仅是编译和编辑。 – 2010-06-04 14:18:05

+0

是的,理解。但是,没有找到。所以你应该了解循环范围的变化。但是,您不必再看3000个循环来查看哪些变量事后重新声明变量......编译器会为您找到这些变量。 – 2010-06-04 15:08:34

我在this post上强调了从VC6到VC9的移植。去年,我从VC6移植到VC9的一款百万线程的单片应用程序,事实证明这非常困难。 VC6由于即使出台也不是非常符合标准而臭名昭着,随着标准在未来几年的发展,VC6的合规性变得更糟。微软利用这个机会在很大程度上解决了VC7中的这个问题,但是这样做破坏了很多在VC6中编译的代码。

在某些情况下,代码被破坏是因为代码本身很差,VC7是一个更好的编译器,不允许VC6做许多*度。但在许多情况下,由于合规性的提高,“良好代码”(从VC6的角度来看)变成了非法代码。一个非常简单的例子:

for(int i = 0, cont = 1; cont; ++i) 
{ 
    // count something up 
} 

cout << "The number is now " << i << endl; 

该代码是完全没有尽可能VC6而言,但是根据ifor块的端部超出范围的标准。有许多其他很多这样的例子,从VC6变成VC7(从VC7变成VC8等)。在继续之前,您应仔细阅读这些变化:

我们有许多令人信服的理由移动到VC9不仅仅是更好地遵守。一个是编译64位应用程序的能力,所以我们最终决定移植整个应用程序。但你可能有其他选择。

如果编译器仅在代码的一部分中为您创建障碍,则可考虑移植该部分,并创建一个在VC9中编译的图层,以弥补VB 8.0与VC6应用程序之间的差距。这可能不过是一个编组代理,它只不过是在主应用程序和第三方组件之间移动数据。