【问题标题】:How to run program written for old compiler?如何运行为旧编译器编写的程序?
【发布时间】:2013-10-27 21:29:45
【问题描述】:

我正在寻找混合树的实现(不重要),并找到一个“旧”的 here

作者说他们已经在 SUN Sparc 平台(运行 Solaris 2.6)和 gcc-2.8.1 编译器上尝试过这段代码。而我的环境是gcc version 4.4.3Ubuntu 10.10)。

问题是: 我使用他提供的 makefile 运行“make”,但它给了我很多错误消息,如下所示:

g++  -c  Node.C
g++  -c  DataNode.C
In file included from DataNode.h:18,
                 from DataNode.C:17:
Query.h:9:20: error: vector.h: No such file or directory
Query.h:10:19: error: stack.h: No such file or directory
Query.h:13:22: error: function.h: No such file or directory
Query.h:14:22: error: iostream.h: No such file or directory
DataNode.C:283:8: warning: extra tokens at end of #endif directive
In file included from DataNode.h:18,
                 from DataNode.C:17:
Query.h:29: warning: ‘typedef’ was ignored in this declaration
Query.h:44: warning: ‘typedef’ was ignored in this declaration
Query.h:86: error: expected initializer before ‘<’ token
Query.h:118: error: ISO C++ forbids declaration of ‘PQ’ with no type
Query.h:118: error: expected ‘;’ before ‘*’ token
Query.h:122: error: ISO C++ forbids declaration of ‘PQ’ with no type
Query.h:122: error: expected ‘;’ before ‘*’ token
Query.h:126: error: ISO C++ forbids declaration of ‘PQ’ with no type
Query.h:126: error: expected ‘;’ before ‘*’ token
Query.h:135: error: expected initializer before ‘<’ token
DataNode.C: In member function ‘void DataNode::DisconnectBranch(int)’:
DataNode.C:80: error: ‘memmove’ was not declared in this scope
make: *** [DataNode.o] Error 1

我知道我需要修改源代码以与现代编译器一致,例如将vector.h更改为vector。但我发现它是无穷无尽的。

所以我的问题是:是否有任何方便的方法来运行这个程序,无论是自动将此代码转换为“现代风格”还是使用独立的“旧风格”编译器?

有什么建议吗?

===更新:===

谢谢大家,我使用--prefix=/usr/local/gcc-2.8.1 将gcc2.8.1 安装在不同的目录中,并修改“makefile”以使用这个旧版本的gcc(/usr/local/gcc-2.8.1/bin/gcc)。但是当我运行“make”时,它仍然给我找不到标题的错误:

/usr/local/gcc-2.8.1/bin/gcc  -c  DataNode.C
In file included from DataNode.h:18,
                 from DataNode.C:17:
Query.h:9: vector.h: No such file or directory
Query.h:10: stack.h: No such file or directory
Query.h:11: deque: No such file or directory
Query.h:12: algorithm: No such file or directory
Query.h:13: function.h: No such file or directory
Query.h:14: iostream.h: No such file or directory
make: *** [DataNode.o] Error 1

然后我尝试使用find /usr/local/gcc-2.8.1 -name "*vector*" 在/usr/local/gcc-2.8.1 中找到这些磁头,但一无所获。

那么旧版本 gcc 的这些头在哪里?

【问题讨论】:

    标签: c++ compiler-construction


    【解决方案1】:

    您可以自己制作一个包含矢量的vertor.h。通过这种方式,您可以无创地修复不兼容性。

    编辑:

    您可能还需要添加一个 using namespace std; 在头文件中。这是 通常是一个坏主意,但这是我无论如何都会这样做的一种情况。

    一旦你让它工作,我会建议重写它以使用新样式的头文件和命名空间。

    【讨论】:

    • 导入命名空间是编译器的事情,所以前面没有#
    • 谢谢。会修。我说我的 c++ 生锈了。
    【解决方案2】:

    Debian Lenny (oldstable) 有 gcc 3.4。这可能具有更好的向后兼容性。尝试为其余问题制作兼容性标头,并通过额外的-I 目录包含它们,例如一个包含vectorvector.h 头文件。

    帮自己一个忙,尽量不要碰旧代码。以不可预见的方式破坏遗留代码很容易。

    【讨论】:

      【解决方案3】:

      您可以尝试在 supports Solaris 2.6 的 QEMU 上运行该程序。唯一的问题可能是寻找安装光盘/映像。另外,有些人在 eBay 上以便宜的价格出售旧的 Solaris 盒子,你也许可以买到。

      GCC 提供非常旧版本的下载,如果您尝试旧版本的编译器,您可能会获得更好的机会。

      【讨论】:

        【解决方案4】:

        gcc-fpermissive 选项:试试看是否至少有一些错误消失了。另外:尝试使用 using 指令制作一个包含 all 必要标头的单个头文件。例如,使stdinc.h 包含:

        #include <vector>
        #include <iostream>
        #include <stack>
        ...
        
        using std::vector;
        using std::fstream;
        ...
        

        将所有提及的旧版 C++ 头文件替换为 stdinc.h 的单个包含。旧的 C++ 没有命名空间,因此即使您只用 using namespace std; 替换单个指令,也不太可能发生冲突。

        【讨论】:

          【解决方案5】:

          如果只是

          #include <vector.h>
          

          #include <vector>
          using namespace std;
          

          为什么不试试 sed?

          grep 查找所有包含以查看是否存在除 c++ 标头之外的其他包含。如果不是你的幸运。

          另一件更棘手的事情是,有一些旧代码依赖于以非标准方式通过迭代器访问数据。我在 Linux 的 Doom 地图编辑器中看到了这一点。那么你可能需要手动操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-21
            • 2018-06-21
            • 2012-12-31
            • 2021-05-21
            相关资源
            最近更新 更多