天天看點

P2PSim在g++ 4.3下的編譯

本文在查理的書架首先釋出,會在最快時間内更新到Nathan的技術空間上

因為科研需要,需要找一個高效的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版本,完成原始積累,開始打高爾夫,說官話。

     本文轉自nathanxu 51CTO部落格,原文連結:http://blog.51cto.com/nathanxu/245100,如需轉載請自行聯系原作者

繼續閱讀