从VC6迁移到VC9的编译问题

时间:2010-08-30 08:17:15

标签: c++ porting vc6 visual-c++-2008

我正在将旧版C ++系统从VC6移植到VC9。

应用程序(<APP A>)静态链接到内部应用程序<APP B>(由内部开发但由单独的团队开发)。 来自<APP B>的头文件的本地副本包含在CPP文件中,并在<APP A>.

中编译

目前我们不打算将<APP B>迁移到VC9。虽然<APP A><APP B>都会使用单独的CRT,但不会发生冲突。

我们面临的问题是来自(本地副本)的包含文件没有使用VC9编译。

  

致命错误C1083:无法打开包含   file:'iostream.h':没有这样的文件或   目录

可能的解决方案: 如果我在<APP A>的本地副本中进行更改并使用VC9进行编译,那么我不确定它是否会在运行时导致某些问题。

有没有其他方法可以让VC9用<APP A>代替<iostream.h>编译<iostream>个文件?

3 个答案:

答案 0 :(得分:4)

很抱歉,但是你遇到了很多问题。

首先是基础:<iostream.h>是较旧的Microsoft标头,用于定义例如::cout<iostream>是标准标头,并定义了例如std::cout。你可以使用这两个,但这个标题 应该包含在APP.H中。 <iostream>未定义您在声明中使用的类型。据推测,您依赖于VC6实现的工件,即<iostream.h><istream.h>中的<ostream.h>。您可能希望切换到<iosfwd>,而 旨在用于标题。

然而,更大的问题是您可以将“APP A”和“APP B”链接在一起,即使它们是使用VC6和VC9编译的。这是真的当且仅当他们共享一个extern "C" API。C ++名称修改(故意)它们之间有所不同。既然你提到<iostream.h>而不是<stdio.h>,我会假设你的共同点真的是C ++。

答案 1 :(得分:1)

Michael Feathers http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052有一本关于这类项目的好书。

简短的回答是,如果您有测试,进行必要的更改和重构并重新运行测试。对于您的示例,我将使用预处理程序指令根据编译器版本选择正确的包含,然后修复任何损坏的测试。

如果没有测试你会遇到更多麻烦,你可以写下它们或祈祷你不要破坏任何东西

答案 2 :(得分:1)

我怀疑这个编译器错误是唯一的问题。更新编译器几乎总是会引入一些问题。最好解决这些冲突并认真检验结果。我不认为一些“解决方法”会减少麻烦,因为无论如何编译器都是不同的。

在并行使用不同编译器时解决此类问题的唯一解决方案是条件编译,例如:

#if _MSC_VER >= 1200 
   // Code for VC 6.0 or higher goes here
#endif

请注意,_MSC_VER的数字与Visual Studio的版本不同。 对于Visual Studio 2010,即_MSC_VER定义为1600。