最近为了项目需要用到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一遍,欧皇附体!

Logo

更多推荐