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

问题描述 投票:0回答:5

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

作者表示他们已经在 SUN Sparc 平台(运行 Solaris 2.6)和 gcc-2.8.1 编译器上尝试过此代码。我的环境是gcc版本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++ gcc
5个回答
8
投票

你可以自己制作一个vertor.h,其中包含向量。这样您就可以非侵入性地修复不兼容性。

编辑:

您可能还需要添加

using namespace std;
在头文件中。这是 一般来说这是一个坏主意,但这是我无论如何都会这样做的一种情况。

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


3
投票

Debian Lenny (oldstable) 有 gcc 3.4。这可能具有更好的向后兼容性。尝试为其余问题制作兼容性标头,并通过额外的

-I
目录包含它们,例如一个
vector.h
头文件,其中包含
vector

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


0
投票

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

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


0
投票

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

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

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

用单个包含

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


0
投票

如果唯一的是

#include <vector.h>

#include <vector>
using namespace std;

为什么不尝试 sed?

grep 查找所有包含内容,看看是否还有除 C++ 标头之外的其他包含内容。如果你不幸运的话。

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

© www.soinside.com 2019 - 2024. All rights reserved.