利用ns2.35仿真zrp 艰难历程之开山篇
安装流程记录及错误解决方案
在用redhat装ns的过程中,几乎各种版本装过去,各种帖子参考过去,仍然没有成功。怒了,索性装了Ubuntu,再来装NS,也是各种帖子撸一遍,也是各种版本装过去,终于成功了。前前后后装了快有三个星期了,当我看到安装成功的信息的时候,几乎不敢相信自己的眼睛。不过还是赶紧记录一下,不然以后又忘记了。
一、 首先安装Ubuntu,在Ubuntu的网站上下载桌面版的安装文件,是个iso文件。通过VM虚拟机装载Ubuntu操作系统。
而后根据提示重启系统,在系统引导界面选择ubuntu系统。进去后就可以等待其自动安装。
二. 下载ns-allinone-2.35安装包,网上搜索一下,有很多网站都有提供下载。
三. NS的安装过程
1、打开终端(ctrl+alt+T),安装必要的工具:
$sudo apt-get update (新安装的系统先执行这条命令)
$sudo apt -get install build-essential
$ sudo apt-get install tcl8.4 tcl8.4-dev tk8.4 tk8.4-dev
$ sudo apt-get install libxmu-dev libxmu-headers
2、$sudo apt-cache search x11-dev出现如下类似的命令(以防出现类似tk8.4.14,安装中断退出)
ibx11-dev - X11 client-side library (development headers)
xlibs-dev - X Window System client library development files transitional package
libghc6-x11-dev - Haskell X11 binding for GHC
libooc-x11-dev - X11 specific modules for the oo2c compiler (devel)
libgl1-mesa-swx11-dev - A free implementation of the OpenGL API -- development support files
分别安装上面的组件,命令如下:
$ sudo apt-get install libx11-dev
$sudo apt-get install xlibs-dev
$sudo apt-get install libghc6-x11-dev
$sudo apt-get install libooc-x11-dev
3、进入下载好的ns-allinone-2.35.tar.gz文件目录,解压缩:
$ tar -xzvf ns-allinone-2.35.tar.gz
此时可以将文件夹拷到要安装的目录(我是安装到目录 /ns2的), 并进入目录:
$ sudo mv ns-allinone-2.35 /ns2
$ cd /ns2/ns-allinone-2.35
然后修改两个地方(针对ununtu9.04以后的版本):
输入cd otcl-1.13,进入otcl-1.13目录,找到configure.in.将77行,SHLIB_LD="ld -shared"改为 SHLIB_LD="gcc -shared"
同时修改configure 第6304行SHLIB_LD="ld -shared"改为SHLIB_LD="gcc -shared"
4、正式进入安装过程:
$ cd .. (回到主目录ns-allinone-2.35)
$ sudo ./install (安装)
5. 安装的过程中,可能出现如下问题:
错误一: tools/ranvar.cc: In member function ‘virtual double GammaRandomVariable::value()’: tools/ranvar.cc:219:70: error: cannot call constructor ‘GammaRandomVariable::GammaRandomVariable’ directly tools/ranvar.cc:219:70: error: for a function-style cast, remove the redundant ‘::GammaRandomVariable’ make: *** [tools/ranvar.o]错误1 Ns make failed! See http://www.isi.edu/nsnam/ns/ns-problems.html for problems
解决办法: 在ns-allinone-2.35/ ns-2.35/tools文件夹下,找到报错提示中的ranvar.cc文件,打开找到对应的219行删 除::GaammaRandomVariable,保存, 即:将219行的 return GammaRandomVariable::GammaRandomVariable(1.0 + alpha_, beta_).value() * pow (u, 1.0 / alpha_); 改为: return GammaRandomVariable(1.0 + alpha_, beta_).value() * pow (u, 1.0 / alpha_); 然后保存退出,重新安装ns2。
错误二: In file included from mac/mac-802_11Ext.cc:66:0: mac/mac-802_11Ext.h: 在成员函数‘u_int32_t PHY_MIBExt::getHdrLen11()’中: mac/mac-802_11Ext.h:175:19: 错误: expected primary-expression before ‘struct’ mac/mac-802_11Ext.h:175:41: 错误: ‘dh_body’在此作用域中尚未声明 mac/mac-802_11Ext.h:175:51: 错误: ‘offsetof’在此作用域中尚未声明 mac/mac-802_11Ext.h:177:3: 警告: 在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
解决办法: 在ns-allinone-2.35 s-2.35\mac\mac-802_11Ext.h 文件添加#include <cstddef>然后重新安装,就OK了。
错误三: mobile/nakagami.cc: 在成员函数‘virtual double Nakagami::Pr(PacketStamp*, PacketStamp*, WirelessPhy*)’中: mobile/nakagami.cc:185:67: 错误: 不能直接调用构造函数‘GammaRandomVariable::GammaRandomVariable’ [-fpermissive] mobile/nakagami.cc:185:67: 错误: 对于函数类型的类型转换,移除冗余的‘::GammaRandomVariable’ [-fpermissive]
解决办法: 在ns-allinone-2.35/ ns-2.35/ mobile文件夹下,找到报错提示中的nakagami.cc文件,打开找到对应的183行删除::ErlangRandomVariable,保存, 即:将183行的 resultPower = ErlangRandomVariable::ErlangRandomVariable(Pr/m, int_m).value(); 改为: resultPower = ErlangRandomVariable(Pr/m, int_m).value(); 在ns-allinone-2.35/ ns-2.35/ mobile文件夹下,找到报错提示中的nakagami.cc文件,打开找到对应的185行删除::GammaRandomVariable,保存, 即:将185行的 resultPower = GammaRandomVariable::GammaRandomVariable(m, Pr/m).value(); 改为: resultPower = GammaRandomVariable(m, Pr/m).value(); 重新在ns目录下键入$ ./install安装,再次出现同类问题时,仿照此次解决方法,找到对应的文件和行数,修改即可。
6. 安装成功后,配置环境变量
进入目录/home/*user*(**是用户名,如我的是/home/Administrator),然后
$ sudo gedit .bashrc
在文件末尾加入(记得把/ns2替换成自己的安装目录):
PATH="$PATH: ns2/ns-allinone-2.35/bin: ns2/ns-allinone-2.35/tcl8.4.18/unix: ns2/ns-allinone-2.35/tk8.4.18/unix"
LD_LIBRARY_PATH="ns2/ns-allinone-2.35/otcl-1.13: ns2/ns-allinone-2.35/lib"
TCL_LIBRARY="$TCL_LIBRARY: ns2/ns-allinone-2.35/tcl8.4.18/library"
保存退出(上述内容在安装结束后的提示中有,见粗体部分)。 使环境变量生效source .bashrc(可省略)
7. 验证NS2
进入终端输入 cd /ns-allinone-2.35/ns-2.35
./validate (这要花一段时间,请耐心等待,这里我等了约一个小时)。
验证结束你将会看到如下信息:
All test output agrees with reference output.
2017年 01月 18日 星期二 10:33:41 CST
These messages are NOT errors and can be ignored:
warning: using backward compatibility mode
This test is not implemented in backward compatibility mode validate
overall report: some portable tests failed:
./test-all-newreno ./test-all-tcpOptions ./test-all-tcpVariants ./test-all-aimd ./test-all-frto ./test-all-quickstart ./test-all-manual-routing ./test-all-links
some non-portable tests also failed:
./test-all-session
to re-run a specific test, cd tcl/test; ./test-all-TEST-NAME
8.输入 sudo apt-get install gawk (for gawk) ,这个比较快,一分钟
9.输入sudo apt-get install gnuplot (for gnuplot) 这个5 分钟内可以完成
10. 结束
在终端中输入ns ,若出现% 则安装成功。其实不是的。
当我运行
$ cd ~/ns-allinone-2.35/ns-2.35/tcl/ex
$ ns simple.tcl
想验证下安装成功没时,报错:
couldn't open "out.tr": permission denied
while executing
"open out.tr w"
invoked from within
"set f [open out.tr w]"
(file "simple.tcl" line 13)
permission denied 意思是说 权限不够
好,我换根用户 sudo su
输入命令 ns
报错:“程序“ns”尚未安装。 您可以使用以下命令安装: apt-get install ns2“
(英文版的应该就是Bash:ns :commend not found)
说明ns2 2.35 没有完全安装成功 !
在网上找到一个帖子解决了这个问题,试试make命令,使ns和nam路径在系统PATH中可用。
$~ns-allinone-2.35/ns-2.35
$ sudo make install
终端显示 for d in /usr/local/man/man1; do \
if [ ! -d $d ]; then \
mkdir -p $d ;\
fi;\
done
/usr/bin/install -c -m 755 ns /usr/local/bin
/usr/bin/install -c -m 644 ns.1 /usr/local/man/man1
$ cd ~ns-allinone-2.35/nam-1.14(nam文件在这个目录下)
$ sudo make install
终端显示/usr/bin/install -c -m 755 nam /usr/local/bin
这样把ns和nam的路径添加到系统路径下啦(通常ns和nam只依赖于usr/lib下的库文件)
安装完成后添加运行环境
ns-allinone-2.35文件夹之前为安装路径,各不相同。
网上的有些环境变量的添加格式不对,修改系统文件前请备份,谨慎。
export PATH=“$PATH:/home/rooter/Documents/Firstfile/ns-allinone-2.35/bin: /home/rooter/Documents/Firstfile/ns-allinone-2.35/tcl8.5.10/unix: /home/rooter/Documents/Firstfile/ns-allinone-2.35/tk8.5.10/unix”
export LD_LIBRARY_PATH=“$ LD_LIBRARY_PATH: /home/rooter/Documents/Firstfile/ns-allinone-2.35/otcl-1.14: /home/rooter/Documents/Firstfile/ns-allinone-2.35/lib”
export TCL_LIBRARY= “$TCL_LIBRARY:/home/rooter/Documents/Firstfile/ns-allinone-2.35/tcl8.5.10/library”