【问题标题】:Compilation issues for Migration from VC6 to VC9从 VC6 迁移到 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之间存在数据交换是对的。但是这里没有这样的交换,因此,我认为没有冲突。

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


【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        相关资源
        最近更新 更多