从 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 的编译问题的主要内容,如果未能解决你的问题,请参考以下文章
我可以将 VC9 编译的 PHP 与 Apache 一起使用吗?