我正在寻找混合树的实现(不重要),并找到一个“旧”树这里。
作者表示他们已经在 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 的这些头在哪里?
你可以自己制作一个vertor.h,其中包含向量。这样您就可以非侵入性地修复不兼容性。
编辑:
您可能还需要添加
using namespace std;
在头文件中。这是
一般来说这是一个坏主意,但这是我无论如何都会这样做的一种情况。
一旦你让它工作,我会建议重写它以使用新样式的头文件和命名空间。
Debian Lenny (oldstable) 有 gcc 3.4。这可能具有更好的向后兼容性。尝试为其余问题制作兼容性标头,并通过额外的
-I
目录包含它们,例如一个 vector.h
头文件,其中包含 vector
。
帮自己一个忙,尽量不要碰旧代码。以不可预见的方式破坏遗留代码很容易。
您可以尝试在QEMU上运行该程序,它支持Solaris 2.6。唯一的问题可能是寻找安装光盘/映像。另外,有人在 eBay 上以便宜的价格出售旧的 Solaris 盒子,你也许可以买一个。
GCC提供了非常旧版本的下载,如果您尝试旧版本的编译器,您可能会获得更好的机会。
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;
替换单个指令,也不太可能发生冲突。
如果唯一的是
#include <vector.h>
到
#include <vector>
using namespace std;
为什么不尝试 sed?
grep 查找所有包含内容,看看是否还有除 C++ 标头之外的其他包含内容。如果你不幸运的话。
另一件更棘手的事情是,有一些旧代码依赖于以非标准方式通过迭代器访问数据。我在 Linux 的 Doom 地图编辑器中看到了这一点。那么你可能需要做手动的事情。