现在的位置: 首页 > 综合 > 正文

在vs.net 2003中编译ns2(1):编译tcl

2013年09月07日 ⁄ 综合 ⁄ 共 2815字 ⁄ 字号 评论关闭
 

NS是一种针对网络技术的源代码公开的、免费的软件模拟平台,研究人员使用它可以很容易的进行网络技术的开发,而且发展到今天,它所包含的模块已经非常丰富,几乎涉及到了网络技术的所有方面。所以,NS成了目前学术界广泛使用的一种网络模拟软件。在每年国内外发表的有关网络技术的学术论文中,利用NS给出模拟结果的文章最多,通过这种方法得出的研究结果也是被学术界所普遍认可的,此外,NS也可作为一种辅助教学的工具,已被广泛应用在了网络技术的教学方面。因此,目前在学术界和教育界,有大量的人正在使用或试图使用NS。
然而,对初学者来说,NS是非常难于掌握的,一般人从学习NS到上手至少需要半年多时间。原因是多方面的:一方面,NS内容庞杂,随软件所提供的手册更新不够快,初学者阅读起来非常困难;另一方面,使用NS还要掌握其它很多必备的相关知识以及相关工具,这会使初学者感到无从入手;有的使用者可能还不了解网络模拟的过程或是对NS软件的机制缺乏理解,这也影响了对NS的掌握。另外,不论在国外还是国内,还没有一本书能集中回答和解决这些问题,这也是NS难于被掌握的一个重要原因。
(上两段为抄袭,呵呵)
本文主要用于解决在vs.net 2003 ide下编译ns2的问题。
首先在ns-all-inone-2.31目录下创建一个vs2003的Solution,以下如无特别说明,$(SolutionDir)均指D:/ns-allinone-2.31/vs2003
1.1    编译wintcl.dll
1、 创建wintcl.dll工程。
2、 删除wintcl.cpp(自动生成的文件)中的DllMain函数。原因:tcl提供了此函数。
3、 将工程的输出路径改为:$(SolutionDir)/Debug。原因:将所有生成的dll和exe放在同一目录下,避免产生找不到文件的情况。
4、 将中间目录改为:$(SolutionDir)/Debug/wintcl。原因:个人喜爱。
5、 在“C/C++ -> 附加包含目录”中添加:
"D:/ns-allinone-2.31/tcl8.4.14/generic";
"D:/ns-allinone-2.31/tcl8.4.14/win"
6、 将“C/C++ -> 代码生成 -> 运行时库”改为“多线程调试DLL”。原因:避免C运行时库链接错误。
7、 在“C/C++ ->预处理器”中添加Build_tcl的宏定义。原因:这样可以导出符号。
8、 在“C/C++ ->预编译头”中改为“自动生成”。原因:避免#include “stdafx.h”。
9、 将tcl8.4.14/generic; tcl8.4.14/win; tcl8.4.14/compat; 3个目录下.c和.h文件添加到工程中。
10、              从工程中删除以下文件:
compat:
tmpnam.c
opendir.c
memcmp.c
strstr.c
strtoul.c
strtol.c
strtod.c
waitpid.c
generic:
rege_dfa.c
regc_nfa.c
regc_locale.c
regc_lex.c
regc_cvec.c
regc_color.c
tclLoadNone.c
regfronts.c
win:
nmakehlp.c
cat.c
stub16.c
tclAppInit.c
11、              打开tcl.h,添加
#ifdef Build_tcl
#define WINTCL_API __declspec(dllexport)
#else
#define WINTCL_API __declspec(dllimport)
#endif
#define TCL_PIPE_DLL "1" 
TCL_PIPE_DLL实际上应该指向一个pip*.dll这样的文件名,实际这个文件不存在也没有关系,因此任意定义了一个字符串。
在tcl.h中找到EXTERN的定义并注释掉这些代码:
/*
 * Make sure EXTERN isn't defined elsewhere
 */
#ifdef EXTERN
#   undef EXTERN
#endif /* EXTERN */
 
#ifdef __cplusplus
#   define EXTERN extern "C" TCL_STORAGE_CLASS
#else
#   define EXTERN extern TCL_STORAGE_CLASS
#endif
在工程中搜索EXTERN并将之替换为WINTCL_API。记住务必使用大小写匹配和全字匹配。
原因:EXTERN这个名字太普通了,会造成很在的困扰。
  12、 打开tclDecls.h,查找

extern TclStubs *tclStubsPtr;
将之改为extern WINTCL_API TclStubs *tclStubsPtr;
13、 打开tclStubLib.c,查找
TclStubs *tclStubsPtr = NULL;
将之改为:
WINTCL_API TclStubs *tclStubsPtr = NULL;
14、              编译工程,生成wintcl.dll
1.2    编译tclsh.exe
1、 创建tclsh.exe工程,类型为命令行程序,选择空项目选项。
2、 在工程中添加以下文件:
D:/ns-allinone-2.31/tcl8.4.14/win/tclAppInit.c
3、 将工程的输出路径改为:$(SolutionDir)/Debug。原因:将所有生成的dll和exe放在同一目录下,避免产生找不到文件的情况。
4、 将中间目录改为:$(SolutionDir)/Debug/tclsh。原因:个人喜爱。
5、 在“C/C++ -> 附加包含目录”中添加:
"D:/ns-allinone-2.31/tcl8.4.14/generic";
"D:/ns-allinone-2.31/tcl8.4.14/win"
6、 将“C/C++ -> 代码生成 -> 运行时库”改为“多线程调试DLL”。原因:避免C运行时库链接错误。
7、 在“C/C++ ->预编译头”中改为“自动生成”。原因:避免#include “stdafx.h”。
8、 将wintcl.dll设置为此项目的依赖项目。
9、 在Windows系统环境中添加一个变量:
TCL_LIBRARY:D:/ns-allinone-2.31/tcl8.4.14/library
10、              编译运行
11、              在TCL命令行下运行测试tcl:
cd tcl8.4.14
cd tests
source all.tcl

  

1.3      生成html文档
运行tclsh,运行以下命令:
cd tcl8.4.14
cd tools
source tcltk-man2html.tcl
完成之后将在tcl8.4.14目录下生成html目录,其中就包含了HTML文档。

抱歉!评论已关闭.