从 VC6 迁移到 VC9 的编译问题

Posted

技术标签:

【中文标题】从 VC6 迁移到 VC9 的编译问题【英文标题】:Compilation issues for Migration from VC6 to VC9 【发布时间】:2010-08-30 08:17:14 【问题描述】:

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

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

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

我们面临的问题是来自 (local copy in) 的包含文件没有被 VC9 编译。

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

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

有没有其他方法可以让 VC9 用<iostream.h> 而不是<iostream> 编译<APP A> 文件?

【问题讨论】:

"将使用单独的 CRT,但不会发生冲突。"你为什么不期待冲突?如果<APP B>(可能是一个库)在其头文件中引用流对象,并且当您在 A 和 B 之间调用时使用这些流对象的不同定义,那么(从表面上看)您很可能会拥有严重的问题。 APP之间存在数据交换是对的。但是这里没有这样的交换,因此,我认为没有冲突。 【参考方案1】:

抱歉,您遇到了很多问题。

首先是基础知识:<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++。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

以上是关于从 VC6 迁移到 VC9 的编译问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP版本中的VC6,VC9,VC11,TS,NTS区别

我可以将 VC9 编译的 PHP 与 Apache 一起使用吗?

PHP中VC6VC9TSNTS版本的区别与用法详解

转载PHP中VC6VC9TSNTS版本的区别与用法详解

PHP关于VC11,VC9,VC6以及Thread Safe和Non Thread Safe版本选择的问题

php的几个版本的区别