Linux下安装ns2
Linux环境下安装ns2的有效过程及Can't locate getopts.pl in @INC (@INC contains: /etc/perl xxxx) 错误分析和解决
最近为了项目需要用到NS2软件用于网络仿真实验,从Windows到Linux折腾了我将近一周的时间。在Windows装了卸、卸了装十几遍还是不成功,最后放弃了,回到了Linux系统,又折腾了两天终于安装+测试成功!(安装其实蛮顺利的,就是./validate的过程中一个bug卡了一天,第6步中会详细介绍!)
1. 安装前准备
下载ns2.35安装包(选择其它版本也OK)
https://nchc.dl.sourceforge.net/project/nsnam/allinone/ns-allinone-2.35/
下载后置于 /home/用户名/Documents目录下,并解压
cd /home/用户名/Documents
tar xvfz ns-allinone-2.35.tar.gz
cd ns-allinone-2.35
这里需要修改一下文件ls.h的内容(关键的一步,否则会报错)
vim ns-2.35/linkstate/ls.h
找到第137行 void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
修改为:void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); }
wq保存退出
2. 安装依赖
首先更新一下资源
sudo apt-get update #更新源列表
sudo apt-get upgrade #更新已经安装的包
sudo apt-get dist-upgrade #更新软件,升级系统
接下来安装ns需要的一些工具,这些但是后面安装ns时不可缺少的工具,否则会出错。
sudo apt-get install build-essential autoconf automake
sudo apt-get install tcl8.5-dev tk8.5-dev #tk(toolkit)是用来做图形用户界面(GUI)的工具,与tcl命令结合可以创建和操作GUI的窗口组件
sudo apt-get install perl xgraph libxt-dev libxmu-dev libx11-dev
3. 安装ns 2.35
cd /home/用户名/Documents/ns-allinone-2.35
./install
如果命令行出现以下界面,说明安装成功!
图中红框内为环境变量信息,后面也需要进行配置。
4. 配置环境变量
sudo gedit ~/.bashrc
在文件末尾加上以下信息
注意:1.将其中的"ns"更换为自己的用户名。
2.环境变量的路径信息庆根据自己安装完成后的提示(上图红框)进行检查修改。
3.如果环境变量配错的话,会提示“程序“ns”尚未安装,此时应该继续修改环境变量而不是使用sudo apt-get install ns2进行重新安装!
# LD_LIBRARY_PATH
OTCL_LIB=/home/ns/Documents/ns-allinone-2.35/otcl-1.14
NS2_LIB=/home/ns/Documents/ns-allinone-2.35/lib/
USR_Local_LIB=/usr/local/lib/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OTCL_LIB:$NS2_LIB:USR_Local_LIB
#TCL_LIBRARY
TCL_LIB=/home/ns/Documents/ns-allinone-2.35/tcl8.5.10/
USR_LIB=/usr/lib/
export TCL_LIBRARY=$TCL_LIBRARY:$TCL_LIB:$USR_LIB
#PATH
#XGPATH=/home/ns/Documents/ns-allinone-2.35/bin:/home/ns/Documents/ns-allinone-2.35/tcl8.5.10/unix:/home/ns/Documents/ns-allinone-2.35/tk8.5.10/unix
XGPATH=/home/ns/Documents/ns-allinone-2.35/xgraph-12.2:/home/ns/Documents/ns-allinone-2.35/bin:/home/ns/Documents/ns-allinone-2.35/tcl8.5.10/unix:/home/ns/Documents/ns-allinone-2.35/tk8.5.10/unix
NS=/home/ns/Documents/ns-allinone-2.35/ns-2.35/ns
NAM=/home/ns/Documents/ns-allinone-2.35/nam-1.15/nam
export PATH=$PATH:$XGPATH:$NS:$NAM
保存退出后, 执行 以下命令更新环境变量。
source ~/.bashrc
5. 测试
在 /home/用户名/Documents/ns-allinone-2.35/ns-2.35/ 路径下执行命令:
./validate
时间很长(由网速决定,正常情况下大约半个小时),耐心等待,如果出现以下界面说明安装是没有任何问题的。
然后重启Terminal,输入ns,如果出现%,说明ns2安装成功!然后可以运行一个实例查看效果。
cd /home/用户名/Documents/ns-allinone-2.35/ns-2.35/tcl/ex/
ns simple.tcl
若弹出GUI界面,代表正确安装。
6. Can't locate getopts.pl in @INC (@INC contains: /etc/perl xxxx) 错误解析
如果你能完全按照以上流程走完,那么恭喜你没有踩坑!
我在./validate时遇到了一个错误
Can't locate getopts.pl in @INC (@INC contains: /etc/perl xxxx)
1. 错误原因分析
在有些早期的perl的脚本中,会有这样一句话
require 'getopts.pl';
可是在程序的文件夹下没有这个脚本,并且运行脚本会报错
Can't locate getopts.pl in @INC
2. 解决思路
参考别人的文章提到一下两个解决方案:
1)找到报错脚本,只需要将脚本添加一句话
use Getopt::Std;
然后将对应的出错的perl脚本中的函数方法Getopt
改为getopts
就可以了。
2)这个是参考网上的方法,安装一个能兼容perl4的包
cpan Perl4::CoreLibs
但是,很遗憾,两个方法我都没成功,不知道为什么第二个很多人安装不成功 。
以下是我的终极解决办法:
1)下载一个perl4的包,地址如下
http://search.cpan.org/CPAN/authors/id/Z/ZE/ZEFRAM/Perl4-CoreLibs-0.004.tar.gz
然后进行解压(在任意目录都行,反正后面会删除),可以看到下面的lib目录。
2)然后,在/usr/lib
目录中创建了一个新文件夹,并命名为libperl4-corelibs-perl
,因为这似乎是标准的。
检查一下确保没有一个具有该名称的目录。
$ stat /usr/lib/libperl4-corelibs-perl
stat: cannot stat '/usr/lib/libperl4-corelibs-perl': No such file or directory
然后创建目录。
mkdir /usr/lib/libperl4-corelibs-perl
3)接下来将所有*.pl
个文件复制到此目录中。
可以使用命令进行批量操作:
find ./lib -type f -name "*.pl" -print0 | xargs -I'{}' -0 \
bash -c 'new_dir=/usr/lib/libperl4-corelibs-perl/; chmod +x {}; \
echo "Moving {}"; sudo mv {} ${new_dir} && echo -e "success\n" || \
echo -e "failure\n"' | tee moving_day.log
如果输出为success表示操作成功,否则失败。
如果要查看所有内容已成功复制,请运行以下命令:
find ./lib -type f -name "*.pl" -print0 | xargs -I'{}' -0 \
bash -c 'new_dir=/usr/lib/libperl4-corelibs-perl/; chmod +x {}; \
mv {} ${new_dir}'
4)可以将该路径写入到环境变量中
$ echo -e "\n\n## allow Perl to use the files in Perl4::CoreLibs" >> $HOME/.bashrc
$ echo -e "export PERLLIB=\"/usr/lib/libperl4_corelibs_perl:$PERLLIB\"" >> $HOME/.bashrc
$ source .bashrc
这是通过命令行写入的方式,同样也可以像前面一样打开~/.bashrc文件,然后在末尾添加。得到的结果如下图:
此时,再运行此命令,然后发现错误依然存在,
(@INC contains: /home/zhh/SSPACE2.0/dotlib/ /usr/local/lib/perl5/site_perl/5.16.3/x86_64-linux /usr/local/lib/perl5/site_perl/5.16.3 /usr/local/lib/perl5/5.16.3/x86_64-linux /usr/local/lib/perl5/5.16.3 .)
并且后面跟了很多路径,说明这些路径中同样需要getopts.pl文件,那我们只需要将该文件copy到所有路径下(有些路径是软连接,无法复制,直接跳过就行)即可。
最后,再./validate一遍,欧皇附体!
更多推荐
所有评论(0)