如何运行为旧编译器编写的程序?

时间:2011-12-29 14:52:31

标签: c++ compiler-construction

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

作者说他们已经在SUN Sparc平台(运行 Solaris 2.6 )和 gcc-2.8.1 编译器上尝试了此代码。我的环境是 gcc版本4.4.3 Ubuntu 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在哪里呢?

5 个答案:

答案 0 :(得分:8)

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

编辑:

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

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

答案 1 :(得分:3)

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

请帮忙,尽量不要触及旧代码。很容易以不可预见的方式破坏遗留代码。

答案 2 :(得分:0)

您可以尝试在supports Solaris 2.6的QEMU上运行该程序。唯一的问题可能是寻找安装光盘/图像。此外,还有人在eBay上以便宜的价格销售旧的Solaris盒子,你可以买一个。

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

答案 3 :(得分:0)

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

#include <vector>
#include <iostream>
#include <stack>
...

using std::vector;
using std::fstream;
...

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

答案 4 :(得分:0)

如果唯一的事情是

#include <vector.h>

#include <vector>
using namespace std;

为什么不试试sed?

grep for all includes查看是否还有其他包含而不是c ++标头。如果不是你的幸运。

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