注:原文在博客大巴发表,现搬迁至CSDN。
如今网络模拟的软件很多,现在我用的是NS2,原因是NS2是自己接触最早的,也是最早折磨自己的。关于不同款网络模拟软件的比较,网上有很多的帖子,我在这里就不一一叙述了.为什么说NS2比较折磨人呢。1.该款软件的安装过程比较复杂,安装在windows中更加复杂,我并不想在windows安装Cygwin来引进更加麻烦的环境配置,所以我选择了在linux环境中按转NS2,安装的整个过程是不断的根据报错改错。2.当你安装完毕,运行tcl文件,看到网络仿真图,你正想松一口气,但是你又在想,tcl运行的时候底层的C++是如何运作的?可能你想到GDB调试了,但是用惯了VS的我,用VIM看整个的工程代码还是很吃力的,有没有更好的方法去看整个的工程代码呢? 这就是本篇文章所要解决的问题。
怎样用Eclipse调试NS2
前提:拥有安装好了NS2的linux系统。
阶段一. 制作ns的debug版本
首先,请看一下ns-allinone-2.29/ns-2.29/ns 文件的大小,最初的大小只有几M,因为这时ns不是debug模式,所以这时即便将整个的ns-allinone-2.29导入Eclipse,也是无法进行调试的。这时要做的是更改ns为debug模式,ns是与tcl,tk,otcl,tclcl相关联的,需要想更改这后的这四个文件熟悉为debug模式,然后再更改ns为debug模式,才能真正的使用Eclipse对NS2进行调试。tcl,tk,otcl,tclcl之间是有相互依赖关系的,重新编译的时候应当注意先后顺序,并把生成的debug版本的静态链接库文件复制到ns-allinone-2.29/lib/目录下。
/****************************************************************************************************************************************/
以下内容来源:http://hi.baidu.com/aoxinguy/item/c85238cfa6d0fd25e80f2e7a
/生成NS可执行文件时所需要的几个静态链接库(有四个自定义的)
G++ NS
-L/home/lab/workdir/ns-allinone-2.31/tclcl-1.19 -ltclcl
-L/home/lab/workdir/ns-allinone-2.31/otcl-1.13 -lotcl
-L/home/lab/workdir/ns-allinone-2.31/lib -ltk8.4
-L/home/lab/workdir/ns-allinone-2.31/lib -ltcl8.4
-lnsl
-ldl
-lm
-lm
/这四个自定义的库,生成时所需要依赖的库
tclcl
-L/home/lab/workdir/ns-allinone-2.31/otcl-1.13 -lotcl
-L/home/lab/workdir/ns-allinone-2.31/lib -ltk8.4
-L/home/lab/workdir/ns-allinone-2.31/lib -ltcl8.4
Otcl (注意 make clean 会将Makefile也删除去,因此,因先make clean,然后再./configure --enable-debug)
-L/home/lab/workdir/ns-allinone-2.31/lib -ltk8.4
-L/home/lab/workdir/ns-allinone-2.31/lib -ltcl8.4
-lXext -lX11 -lnsl -ldl -lm
TK
-L/home/lab/workdir/ns-allinone-2.31/tcl8.4.14/unix -ltcl8.4
-L/home/lab/workdir/ns-allinone-2.31/tcl8.4.14/unix -ltclstub8.4
Tcl
MATH_LIBS = -lieee -lm
LIBS = -ldl $(MATH_LIBS)
故NS2所依赖的这四个静态库的重新编译顺序为:
Tcl -> TK -> Otcl -> tclcl
感谢作者,在我最不知所措的时候看了你的文章给了我启发。
/********************************************************************************************************************************************/
下面,按照依赖顺序,依次编译静态链接库:
Tcl
修改/ns-allinone-2.29/tcl8.4.11/unix/Makefile文件。从
# To change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
#CFLAGS = $(CFLAGS_DEBUG)
#CFLAGS = $(CFLAGS_OPTIMIZE)
#CFLAGS = $(CFLAGS_DEBUG) $(CFLAGS_OPTIMIZE)
CFLAGS = $(CFLAGS_OPTIMIZE) -DTCL_DBGX=$(TCL_DBGX)
修改为
# To change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
#CFLAGS = $(CFLAGS_DEBUG)
#CFLAGS = $(CFLAGS_OPTIMIZE)
CFLAGS = $(CFLAGS_DEBUG) $(CFLAGS_OPTIMIZE)
#CFLAGS = $(CFLAGS_OPTIMIZE) -DTCL_DBGX=$(TCL_DBGX)
之后,在当前目录下 make clean , make。将新生成的libtcl8.*.a 和libtclstub.*.a 两个静态库文件,复制到nsallinone*/lib目录下。
TK
方法与Tcl一致,make后将新生成的同样,将新生成的静态库文件加入到lib目录下。
Otcl
进入Otcl目录make clean,修改一下configure文件,将SHLIB_LD="ld -shared"修改为SHLIB_LD="gcc -shared"。
然后再生成Makefile文件,如下:
$./configure --enable-debug
最后:$make
同样将生成的静态链接库文件加入到lib中。(此处原帖中未说明)
tclcl
make clean
./configure --enable-debug
make
同样将生成的静态链接库文件加入到lib中。(此处原贴中未说明)
至此,ns所依赖的静态链接库已经编译完毕,现在可以重新编译ns文件了。
在ns-2.29目录中,修改Makefile文件信息,在CCOPT选项中加入-g。
在这里,我不建议使用./configure --enable-debug,这会在CCOPT中加入新的-Wno-parentheses -Werror。
在编译的时候,很多以前的warning信息会变成error.之后再make clean ,make
现在检查ns文件的大小,发现已经变为20M左右。
至此,ns的debug版本制作完毕。
阶段二.将ns2工程导入Eclipse
下载eclipse-cpp-juno-SR2-linux-gtk-x86_64
安装jdk,配置环境/etc/profile
具体做法:启动Eclipse时 ,在出现的框中选择ns-allinone-2.29所在的目录。
新建C++ makefile工程:在project Explorer中右键,新建C++工程;输入工程名字ns-2.29(会提示你覆盖原来的文件夹,没事的), 设置工程属性,位置是ns的安装目录即:/yourname/ns-allinone-2.29,类型是Makefile Project -> Empty C++ Project,tool chain 选linux GCC,点击finish.
设置Run属性:右击项目名称,选择 properties, 在出现的属性页的左边选 Run/Debug Settings, 点击右边的New按钮,在随即弹出的窗口中选中C/C++ Local Application, 点击OK按钮,会弹出一个Properties for New_configuration的框,在Main页的C/C++Applicaion中选择NS的可执行文件即可。
运行: 做好以上设置后可以编译,并运行ns。编译时在Eclipse中点击project-> clean, project->build all, 编译需要大约10分钟左右的时间。运行可点击工具栏中的Run ns-2.xx Default 按钮来运行。 运行后Console中的提示符变为%,此时可在Console中执行NS命令。比如可输入:
Puts “Hello NS2”
会输出: Hello NS2
这表明在Eclipse中调试NS基本成功了。
还可以添加tcl脚本目录来运行相关的文件。由于ns以及相关的执行文件都制作了debug版本,因此,现在可以进入函数体进行调试了。enjoy it !
同时也要感谢以下博客,解答了我的不少疑惑:
http://hi.baidu.com/aoxinguy/item/37def70e269148ce9157187e
http://blog.csdn.net/bennyfun79/article/details/5652179
http://www.cnblogs.com/zhangleiccst/archive/2011/05/29/2062284.html
本文完