NS2是一个功能强大的网络模拟工具,下面介绍一下我在ubuntu7.10系统下安装NS2所遇到的艰难险阻,给后来者以借鉴。
在Ubuntu 11.04中安装ns-2.33,以前在Ubuntu-10.10安装ns-2.33没有遇到过这种错误,后来升级了一下Ubuntu的版本,就会出现以下错误。
可参考以下网址上说的解决方法:
http://erl1.wordpress.com/2011/05/12/installing-ns-2-34-on-ubuntu-11-04/
1.错误一:安装NS2.33过程中出现如下的错误:
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
这是由于gcc版本提高后对类内部函数调用的简化造成的不兼容,解决方法如下:
在ns-allinone-2.33/ ns-2.33/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_);
-----------------------------------------------------------------------------------------------------------------------------------------------
2.错误二:重新在ns目录下键入$ ./install安装,再次出现同类问题时,
如:
mobile/nakagami.cc: In member function ‘virtual double Nakagami::Pr(PacketStamp*, PacketStamp*, WirelessPhy*)’:
mobile/nakagami.cc:183:73: error: cannot call constructor ‘ErlangRandomVariable::ErlangRandomVariable’ directly
mobile/nakagami.cc:183:73: error: for a function-style cast, remove the redundant ‘::ErlangRandomVariable’
mobile/nakagami.cc:185:67: error: cannot call constructor ‘GammaRandomVariable::GammaRandomVariable’ directly
mobile/nakagami.cc:185:67: error: for a function-style cast, remove the redundant ‘::GammaRandomVariable’
make: *** [mobile/nakagami.o]错误1
Ns make failed!
See http://www.isi.edu/nsnam/ns/ns-problems.html for problems
解决方法:
在ns-allinone-2.33/ ns-2.33/ mobile文件夹下,找到报错提示中的nakagami.cc文件,打开找到对应的183行删除::ErlangRandomVariable,保存,
即:将183行的
resultPower = ErlangRandomVariable::ErlangRandomVariable(Pr/m, int_m).value();
改为:
resultPower = ErlangRandomVariable(Pr/m, int_m).value();
在ns-allinone-2.33/ ns-2.33/ mobile文件夹下,找到报错提示中的nakagami.cc文件,打开找到对应的185行删除::GammaRandomVariable,保存,
即:将185行的
resultPower = GammaRandomVariable::GammaRandomVariable(m, Pr/m).value();
改为:
resultPower = GammaRandomVariable(m, Pr/m).value();
重新在ns目录下键入$ ./install安装,再次出现同类问题时,仿照此次解决方法,找到对应的文件和行数,修改即可。直到安装成功。
----------------------------------------------------------------------------------------------------------------------------------------------
3.错误三:安装成功之后,输入命令ns之后出现如下错误:
*** buffer overflow detected ***: ns terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0x451df0]
/lib/i386-linux-gnu/libc.so.6(+0xe4cca)[0x450cca]
/lib/i386-linux-gnu/libc.so.6(__strcpy_chk+0x3f)[0x45005f]
ns(TclTraceVariableObjCmd+0x420)[0x83adb00]
ns(Tcl_TraceObjCmd+0x469)[0x83b2989]
ns(TclEvalObjvInternal+0x37b)[0x839f2bb]
ns(Tcl_EvalEx+0x419)[0x83a11a9]
ns(Tcl_Eval+0x3c)[0x83a14cc]
ns(Tcl_GlobalEval+0x36)[0x83a2086]
ns(_ZN3Tcl4evalEPc+0x1b)[0x839438b]
ns(_ZN3Tcl5evalcEPKc+0xb3)[0x839435d]
ns(_ZN11EmbeddedTcl4loadEv+0x1d)[0x83952cf]
ns(Tcl_AppInit+0xb5)[0x83940ab]
ns(Tcl_Main+0x285)[0x83eb0c5]
ns(nslibmain+0x20)[0x8393fd4]
ns(main+0x1b)[0x8394147]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x382e37]
ns[0x81a8481]
======= Memory map: ========
00c38000-00c54000 r-xp 00000000 08:01 19439 /lib/i386-linux-gnu/ld-2.13.so
00c54000-00c55000 r--p 0001b000 08:01 19439 /lib/i386-linux-gnu/ld-2.13.so
00c55000-00c56000 rw-p 0001c000 08:01 19439 /lib/i386-linux-gnu/ld-2.13.so
00c5a000-00c5c000 r-xp 00000000 08:01 261673 /usr/lib/i386-linux-gnu/libXau.so.6.0.0
00c5c000-00c5d000 r--p 00001000 08:01 261673 /usr/lib/i386-linux-gnu/libXau.so.6.0.0
00c5d000-00c5e000 rw-p 00002000 08:01 261673 /usr/lib/i386-linux-gnu/libXau.so.6.0.0
00cc0000-00ccd000 r-xp 00000000 08:01 268150 /usr/lib/i386-linux-gnu/libXext.so.6.4.0
00ccd000-00cce000 r--p 0000c000 08:01 268150 /usr/lib/i386-linux-gnu/libXext.so.6.4.0
00cce000-00ccf000 rw-p 0000d000 08:01 268150 /usr/lib/i386-linux-gnu/libXext.so.6.4.0
00ef9000-00f0c000 r-xp 00000000 08:01 19425 /lib/i386-linux-gnu/libnsl-2.13.so
00f0c000-00f0d000 r--p 00012000 08:01 19425 /lib/i386-linux-gnu/libnsl-2.13.so
00f0d000-00f0e000 rw-p 00013000 08:01 19425 /lib/i386-linux-gnu/libnsl-2.13.so
.......(注:这里省略了部分错误提示语句)
bfbbb000-bfbdc000 rw-p 00000000 00:00 0 [stack]
已放弃
这是gcc的版本问题,解决方法如下:
1.安装gcc-4.4
输入:sudo apt-get intall gcc-4.4
2.安装g++-4.4
输入:sudo apt-get intall g++-4.4
3.修改tcl8.4.18/unix文件夹下的文件Makefile.in
将Makefile.in的270行:
CC = @CC@
修改为:
CC = @CC@ -V 4.4
注意是大写的‘V’,这样gcc使用的参数版本为4.4。
重新安装ns2.33。.
解决方案:
这是由于我用的是ubuntu免费邮寄的安装盘,安装后的系统中gcc是不能用来的开发的,只有一个空壳,所以需要重新安装gcc。先用命令: sudo apt-get remove gcc
然后sudo apt -get install build-essential 便成功解决问题。
问题二:再次安装NS2时发现安装至tk8.4.13时出现错误,安装中断退出。在安装日志上发现一句:x11/xlib.h nosuch file or directory 在网上查阅了资料,原来是x11M没有装。
解决方案:
先安装X11,命令为 sudo apt -get install libx11-dev
结果仍然出错如下:
checking for main in -lXbsd... no
checking for socket in -lsocket... no
checking for gethostbyname in -lnsl... yes
checking for dcgettext in -lintl... no
checking for getnodebyname in -ldnet_stub... no
checking that g++ can handle -O2... no
checking standard STL is available... no
checking for tcl.h... -I../include
checking for tclInt.h... -I../include
checking for libtcl8.4... -L../lib -ltcl8.4
checking for init.tcl... ../lib/tcl8.4
checking for http.tcl... ../lib/tcl8.4/http1.0
checking Tcl http.tcl library... yes
checking for tclsh8.4.11... no
checking for tclsh8.4... ../bin/tclsh8.4
checking for tk.h... -I../include
checking for libtk8.4... -L../lib -ltk8.4
checking for tk.tcl... ../lib/tk8.4
checking for X11 header files
can't find X includes
otcl-1.12 configuration failed! Exiting ...
Please check http://www.isi.edu/nsnam/ns/ns-problems.html
for common problems and bug fixes.
还是没有得到解决.分析了一下可能是x11没有安装完整,于是先输入:sudo apt-cache search x11-dev
得到以下信息:
libx11-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
然后继续安装,等了半天,安装完成!
问题三:安装好NS2后,还有设置环境变量。(路径随个人而定,安装好看提示)
命令为: sudo gedit ~/.bashrc
在打开的.bashrc文件结尾加上三句:
export PATH="/home/ns2/ns-allinone-2.30/bin:/home/ns2/ns-allinone-2.30/nam-1.12:/home/ns2/ns-allinone-2.30/tcl8.4.13/unix:/home/ns2/ns-allinone-2.30/tk8.4.13/unix"
export LD_LIBRARY_PATH=" /home/ns2/ns-allinone-2.30/otcl-1.12, /home/ns2/ns-allinone-2.30/lib"
export TCL_LIBRARY=" /home/ns2/ns-allinone-2.30/tcl8.4.13/library"
注意:/home/ns2/ns-allinone-2.30/为安装文件所在目录,三个环境变量的值在NS2安装完成时在提示信息中会给出。
另外补充一点:我在设置了上述环境变量后,发现ls命令不能使用了,我分析得出:可能是设置环境变量时将系统原来的PATH值替换掉了。于是我将上面三句删掉,重新打开一个
终端,输入命令 sudo echo $PATH 得到原始值为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
将上面的值粘贴到上面的第一句末尾,注意用分号分开各个路径,如下:
export PATH="/home/ns2/ns-allinone-2.30/bin:/home/ns2/ns-allinone-2.30/nam-1.12:/home/ns2/ns-allinone-2.30/tcl8.4.13/unix:/home/ns2/ns-allinone-2.30/tk8.4.13/unix:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
然后再将修该后的三个语句放到.bashrc中即可。设置好后,打开终端输入ns回车就会出现%,表明设置成功。
问题四:安装成功后运行样例程序发现ns模拟没有问题就是不能自动调用nam!
显示错误为:
ns: finish: couldn't execute "nam": no such file or directory
while executing
"exec nam out.nam &"
(procedure "finish" line 7)
invoked from within
"finish"
解决方案:
先手动编译nam生成可执行文件nam
进入NS_HOME/nam-1.12(NS_HOME为安装ns2的路径)输入命令:make
结果显示错误:
xwd.c:87:29: 错误: X11/Xmu/WinUtil.h:No such file or directory
make: *** [xwd.o] 错误 1
问题是xmu没有安装,于是只好再装xmu,
命令为:
sudo apt-get install libxmu-dev
然后在输入make进行编译,完成后在NS_HOME/nam-1.12/中可以发现可执行文件nam将其复制到 NS_HOME/bin/目录下,这样由于$PATH环境变量中有NS_HOME/bin项,nam就可以直接运行了。
至此,终于大功告成了!!!
(2)问题解决
一般来说只要环境满足条件,安装应该很顺利
但是也有遇到问题的时候
问题1:
checking system version (for dynamic loading)...
./configure: line 7624:syntax error near unexpected token `)'
./configure: line 7624: ` OSF*)'
tcl8.3.2 configuration failed! Exiting ...
Tcl is not part of the ns project.
解决办法:
在ns-allinone-x.xx目录下
$ grep 'system=MP-RAS-' ***/*/* -n
把那些文件里的
system=MP-RAS-`awk ' { print $3 } '/etc/.relid'`
改为:
system=MP-RAS-`awk ' { print $3 } '/etc/.relid`
也就是那行多了一个'号
问题2:
make: *** [tk3d.o] 错误 1
安装libx11-dev可以解决问题
问题3:
can't find X includes
otcl-1.11 configuration failed Exiting ...
安装x-window-system-dev可以解决问题
问题4:
make: g++:命令未找到
make: ***[tcl2c++]错误 127
tclcl-1.17 make failed! Exiting ...
安装g++
编译出错
1.如何去掉warning: assignment makes pointer from integer without a cast的警告
编写了段代码:
函数原形为:char *cfg_get(const char *name);
在main()中调用上述函数方式如下:
char *dev_IMEI = cfg_get((char *)"dm_imei");
但是此调用处编译出现warming如下:
warning: assignment makes pointer from integer without a cast
请问为啥会有这样的warming,如何修改才能不出现这样的warming?
原因是:头文件里面有声明了函数char *cfg_get(const char *name); ubuntu <wbr>8.04下安装NS2(ns-allinone-2.30)
去掉就可以不
2. syntax error near unexpected token `in
在Vim中解决这个问题,很简单,在Vim中利用替换功能就可以将“^M”都干掉,键入如下替换命令行:
1)vi -b setup.sh
2)在命令编辑行<就是: 按ESC键然后shift+:冒号>输入:%s/^M//g
注意:上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”键生成的。
这样替换掉以后,保存就可以执行了。当然还有其他的替换方式比如:
a.一些linux版本有 dos2unix 程序,可以用来祛除^M。
b.cat filename1 | tr -d "\r" > newfile 去掉^M生成一个新文件,还有sed命令等,凡是可以替换的命令都是可以用来新生成一个文件的
3.implicit declaration of function `memset'
C库没有包含进来
加入include "string.h"就解决不
4.warnings being treated as errors
去掉 CFLAGS 里的 -Werror
按几下TAB看是否是按装相应版本的编译器