2009年12月17日星期四

P2PSim在g++ 4.3下的编译

因为科研需要,需要找一个高效的p2p模拟器,能称得上高效的,并且支持简单拓扑的,也就p2psim了。但是p2psim在2005年已经停止更新了,而且没有多少文档,因此要自己摸索有些问题。
在安装中,我用的是Debian 5.03 lenny平台。g++是4.3版本。下载到的p2psim 0.3版本无法在g++4的版本上进行编译通过。网上最简单的做法是用老版本的linux。这是我不屑做的事情。经过一个下午的折腾,终于把所有编译问题都解决了,在这里做一个问题解决的总结。以便后来人。
我碰到的问题一共有6类。按照出现和解决的次序分别为:
1:hash_map STL错误, C++库更新造成的问题
2: strcmp未申明, g++对缺省include变严格了
3:类函数 Node:xxxx: C++语法版本
4:代码错误 vividi:  作者的低级错误
6:bighashmap.cc include问题: 还是觉得是C++语言机制问题
5:STL里的assert错误: 不清楚原因

1. hash_map STL错误
这个问题g++会提示用到了ext/hashmap这个文件,这个文件已经过时了,现在建议用unordered_hash.解决办法,在configure里面找到DEF定义,加入-Wobsolete 来抑制这个警告就可以了。然后重新configure 和make。

2: strcmp未申明
这个问题很容易解决,在公共包含的.h文件里面引入#include 就可以了。还是新版本的g++变严格了的问题。

3:类函数 Node:xxxx:
在很多.c文件里面,出现了static的类函数前面加上类名字。比如Node 类里面的abc函数是Node::abc(),我不知道这是那门子C++方言。反正在4的版本中g++不允许了。把这些类名去掉就好了。

4:代码错误 vividi
在vividtest.c里面vividitest类里面,有个半吊子成员量定义,用的类型是vividi,从来没被用过,看来是作者的低级错误。注释掉就好了。


6:bighashmap.cc include问题:
这个问题很混蛋,在ld做连接的时候,出现HashMap<>:xxxx()找不到的错误。HashMap是在bighashmap.cc里面声明的,被include在node.c里面了,但是其他地方都没有include. 作者的原意是把模板当作普通类,希望在node.o里面包括,然后连接到其他的.o里面去。真是疯了:C++的模板是源代码级别的展开,根本不可能这么搞的。我改成在所有公共的.h头文件里面包括这个cc文件。


5:STL里的assert错误:
在bighasmap.cc里面 HashMap类模板里面用了不少assert来做出错检查,但是g++觉得这是不允许的,所以统统注释掉就好了。然后就编译通过了。

总结g++ 3.x是个跑单帮的,啥方言都懂,现在到了4.x版本,完成原始积累,开始打高尔夫,说官话。

没有评论:

发表评论