关于NS2所引用的几个静态链接库文件

关于NS2所引用的几个静态链接库文件

/生成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
切换至每个静态库的生成目录,重新修改Makefile,添加调试信息后,再重新生成静态链接库文件

最后,再在NS2目录下,重新连接生成NS2可执行文件。这样,便可以实现NS2在Eclipse中的全程调试。


但是,目前存在的问题是:

我们在Eclipse下调试能够跟踪 添加调试信息后的libtcl8.4.a中所调用的源代码(tclMain.c),但却仍旧 无法跟踪libtclcl.a 库中所对应的源代码(表现为:无法在相应的代码行,tcl.cc中插入断点)?

什么导致这个问题呢?

初步估计是:

1. .cc文件引起的问题? (解决方案:找另一个在libtclcl.a库中的函数,找到其所在源文件且后缀为.c ,测试是否能添加断点?)

2. libtcl8.4.a 被移至 lib目录而 libtclcl.a却仍在源文件目录?(解决方案:待测试后给出)

我经过了初步的跟踪实验,发现:可能NS2本身并没有调用到libotcl 或者 libtclcl 或者 libtk中的函数? (因为,我跟踪了NS2从开始运行到输入一个测试脚本进行仿真的全过程,并看到所有的源码,但源码跳转过程中,并没有跳转到前面提及的几个库所涉及的源文件中去。而对于tclcl.a,因为我们知道tcl.cc文件中关于tclclass的静态类初始化代码定是在main函数前就开始执行, 因此,按理应该能够跟踪到。对于这种情况的可能解释是:eclispe本身就是从main函数开始跳入跟踪的。因此main前面执行的函数无法跟踪到? 这种假设还需要测试。可能在eclipse的调试选 项中有相应的选择 {好像eclipse有一个stop on startup at : main 选项} ,让我们不从main开始调试,从而能跟踪到tclclass类的所有子类的初始化过程?)

--刚刚又查了查资料,好像GDB就是只能从main函数开始跟踪。因为在C++的正规概念里,没有静态类这个概念(真不知NS2中的Tclclass是如何能够添加 static 这个关键字的?),任何一个程序都是从main函数开始执行,因此,GDB从main开始调试也是正常的。? 一般在main函数外的只是一些全局变量的初始化而矣.

明天查一查 GDB 的相关知识,再确定一下问题所在?

后续:上文所讲的所有估计,其实都是基于一个错误的认识:我原以为:TCLClass 这个静态类(这个概念是误传的结果。实际上,NS2中只是在定义TclClass相关类时,顺便地定义了几个静态全局实例而矣) 这些静态全局实例的初始化当然是在main函数前完成。但它的初始化跟实际调用它的代码是两个完全不同的概念。所谓初始化是指为这些静态全局实例变量在全局变量区分配好空间并初始化数据;而调用它,则是通过访问这些已经建好的全局实例的函数(create() ) 来真正创建对应的C++类。

因此,实际上,我们同样也可以跟踪到这些静态全局变量的创建过程(只需要在其祖先类 TclClass的构造函数处加断点即可) 其实,现在,大部分问题已经清晰,并且 我们也可以在Eclispe中完整地跟踪 到NS2的全过程源码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值