快速安装方法:
1,安装activestate activeTcl 8.4.15.0
2,把我的附件解压。
3,在我附件解压后的"tcldp-win目录下,用文本打开teki.tcl,修改set tcl_pkgPath的值,指定到你安装activestate activeTcl 8.4.15.0后,相应的目录下。
4,在activestate activeTcl 8.4.15.0的目录\Tcl\lib\tclib_critcl下的critcl.tcl文件拷贝到\lib下,还有啥目录我忘了,反正后面运行teki.tcl的时候,它抱怨在哪里找不到,就把它拷贝到哪里。
5,修改activestate activeTcl 8.4.15.0的目录"lib"xotcl1.5.3下的pkgIndex.tcl,把unset __dir__给注释掉,如:# unset __dir__
6,回到dp的解压目录"tcldp-win下,运行teki.tcl。如果不出意外,应该就OK啦。
7,进入安装后的dp的demo目录下,可以运行conference目录下的例子,应该没有问题了。这个例子如何玩,请参看它的readme。
dp文件下载链接(这是我调整过的源码。):
/Files/bigstone1998/tcldp-win_bugfix.rar
1.1. Windows下编译安装
目标:已经有了activestate activeTcl 8.4.15.0的工具。现在想把TCL-DP扩展也安装进去。
准备:
tcl843的源码
Tcl-dp的src:tcldp-win.tar.tar (4.0版本的。下载后进入到它的win目录下就可以看到版本。)
Tcl-dp的bin(可选):dp40b2-win32.zip
我的惨痛教训是:下载的dp40b2-win32.zip肯定不是基于TCL8.4的。我费了大力安装好后,运行demo程序就出现异常。所以我们现在先把它放一边。如果你的TCL正好和他匹配的话,没准就节省了编译的活了。
首先保证你的tcl843在windows下是编译成功的。成功后,把release目录下的tcl84.lib拷贝到win目录下,这个后面dp编译的时候会来找。
然后把dp的源码和tcl843的源码并放在一个目录下,如下:
----|
|---tcl8.4.3
|---tcldp-win
下载的dp40b2-win32.zip解压后,准备编译。
先把VC的Bin目录下的VCVAR32S.bat拷贝到tcl-dp的win目录下。
为了方便,我自己做了一个bat文件:
set TOOLS32=E:\Progra~1\Micros~1\VC98
set TCL_GENERIC_DIR=E:\PROGRAMEinfo\TCL\tcl843-src\tcl8.4.3\generic
set TCL_ROOT_DIR=E:\PROGRAMEinfo\TCL\tcl843-src\tcl8.4.3
nmake -f makefile.nmake
makefile.nmake不是源文件包中带的,是我自己基于makefile.80修正的。这可是费了老大的力气,根据错误报告,一点一点更改过来的。
同时,根据报告的错误,对generic和win下的源码进行了修改。修改的地方,大家可以自己去看。当然,我这种修改只保证在tcl8.4.3下编译是没有问题。
先运行VCVAR32S.bat,再运行build.bat。
……
……
好费劲,终于编译成功了。是否能够用,还要用teki.tcl来吧这个dp挂到tcl上才知道。我的TCL是通过activestate activeTcl 8.4.15.0安装的。
运行teki.tcl。又是一堆问题。一个一个解决吧。
首先,是set tcl_pkgPath "E:\\Program Files\\TclPro1.4\\win32-ix86\\lib"
添加到teki.tcl中。这个含义是告诉teki.tcl,我的TCL的package的目录。
然后teki.tcl又会抱怨说有critcl.tcl找不到。其实这个文件就在\Tcl\lib\tclib_critcl下。没办法,把这个文件一个一个拷贝到teki.tcl要的目录下。终于安装好了。可以用了。
注意,通过teki.tcl查看dp包时候,它还报告要tcl7.6,别管它。OK啦。
1.2. Linux下的安装
1.2.1. 97版的dp40b2的安装
tcl-8.4.12-4.src.rpm进行安装。rpm -ivv *****。安装好后,源码还是直接看不到的。在/urs/src/redhat/sources下,可以看到tcl8.4.12-src.tar.gz。
到/usr/src/redhat/specs目录下,运行:
rpmbuild -bp tcl**.specs
最后的源码放在/usr/src/redhat/build下。
如果你是安装redhat的时候默认安装了TCL,那么它的程序会放在/usr/shar/tcl8.4下。
好。现在虽然源码是8.4.12,运行版本是8.4.7,但是我不想动了。就这样凑合着编译吧。
把dp的源码解压,拷贝到刚才的TCL源码同级别的目录下。这样他们是兄弟目录。
----|
|---tcl8.4.12
|---tcl-dp
接下去要配合configure文件做些调整。首先,在/usr/lib/tcl8.4下面找找看有没有tclConfig.sh文件。没有?在/usr/lib下面找找看。找到了,拷贝到/usr/lib/tcl8.4下。我们等会儿用:
./configure --with-tcl=/usr/lib/tcl8.4
来配置。之所以要把那个文件移到/usr/lib/tcl8.4下面,是因为该死的configure通过目录来判别tcl的版本。如果没有tcl8.4,它就默认为tcl7.6。
首先,要把/usr/lib/tcl8.4下的tclconfig.sh给更改一下,如下:
TCL_INCLUDE_SPEC=’-I/usr/src/redhat/BUILD/tcl-8.4.12/tcl8.4.12/generic’
TCL_SRC_DIR=’/usr/src/redhat/BUILD/tcl-8.4.12/tcl8.4.12
接下去要改的就是configure文件了。这个我实在没有办法。在configure文件中找类似
if test $TCL_VERSION -eq 7 ; then
这样一句话。在tclConfig.sh中,TCL_VERSION被定义为8.4。这个值是带小数点的。而test的比较这种语法只能用整数。所以,我改为:
if test $TCL_MAJOR_VERSION -eq 7; then
TCL_MAJOR_VERSION也是在tclConfig.sh中定义的。
然后,./configure ./configure --with-tcl=/usr/lib/tcl8.4
成功。
make,也成功。
cd ..
./teki.tcl,安装。成功后,还是显示7.6,顽固!不过不用管它了。
成功了吗?试试看。运行dp40下面的例子(不用我告诉你,dp40安装在/usr/lib/tcl8.4/dp4.0/examples/conference下吧),wish room.tcl,呵呵,报错,头大了吧。没办法,从TCL8.3以后,TclHasSockets就改名为TclpHasSockets了。
-----胸闷-----
回到dp的源代码,打开dpinit.c。注意,是generic下的,不是unix下的。把TclHasSockets改名为TclpHasSockets,再make一次,teki.tcl先卸载,再安装一次,再验证,恭喜你,应该OK啦。
送佛上西天,好事做到底,干脆告诉你怎么玩room.tcl和enter.tcl把。
在linux下,
1,运行:wish room.tcl
2,然后再开一个窗口,运行tclsh
3,然后在wish的控制台下输入:source enter.tcl。一切稳定后,能够看到TCL的控制台符号%出来。
4,再输入:say How are you?
5,看到什么了吧?
这个版本的dp我感觉没有2003版本的好。下面看2003版本
1.1.2. dp 2003版本
网络链接http://tcldp.sourceforge.net/,名称是tcldp-unix.tar.tar
我遇到的第一个问题是,我的Linux下的tcl是8.4.12,源码也是8.4.12,但是找不到tclConfig.sh文件。胸闷。这个平台的Linux是我新安装的啊。安装的时候,都把tcl给自动安装了,怎么就没有这个文件呢?
没办法。这个文件是configure时候自动生成的。我现在要让它自动生成一个。如果默认运行configure的话,它的目录是(./configure –help中说的):/usr/local/bin, /usr/local/lib等。可是安装linux时候自动安装的tcl的目录不是这个。我查出来是:
- Tclsh安装在/usr/bin下,
- 其他咚咚在/usr/lib下,
我简直要恨死linux了。
运行./configure --prefix=/usr
这样生成一个tclConfig.sh文件。
在这个文件中,最后把下面两个参数确定一下:
TCL_INCLUDE_SPEC=’-I/usr/src/redhat/BUILD/tcl-8.4.12/tcl8.4.12/generic’
TCL_SRC_DIR=’/usr/src/redhat/BUILD/tcl-8.4.12/tcl8.4.12
好,开始折腾tcl-dp。把接好包的tp安装放到tcl8.4同级别的目录下。运行
./configure --with-tcl=/usr/lib/tcl8.4
然后make。没想到,这次是dpEmail.c编译错了。我没有心情去找原因了,直接在
Dp的unix目录下修改make文件:
$(OBJ_DIR)/dpUnixEmail.o: $(UNIX_DIR)/dpEmail.c
$(CC) $(CC_SWITCHS) –c -DLIB="”$(LIB)"”
字样,修改为:
$(OBJ_DIR)/dpUnixEmail.o: $(UNIX_DIR)/dpEmail.c
$(CC) $(CC_SWITCHS) -DHAVE_UNISTD_H –c -DLIB="”$(LIB)"”
然后make,就好了。
最后,谈一下winxp下面的expect的调整。
出现第一个问题:spawn一个进程后,马上出现错误报告,程序退出。细节就不说了,但是,你看看报告中的关键字,就有dbghelp.dll。上网查了半天,终于知道是winxp的这个dll太垃圾。我从win2003 server上找了个2005/1/30日的dbghelp.dll(5.2.3790),就不会出错了。注意,有些情况下,要进入安全模式才能够覆盖掉原来的文件。(重启时候F8进入安全模式)
出现的第二个问题:spawn ping xxx.xxx.xxx.xxx后,居然expect不到任何东西。只能够匹配到eof,也就是说spawn出来的进程,马上给关掉了!这个问题我查了半天,终于明白是windows的一个DEP的机制在做怪。详情可以参考:http://support.microsoft.com/kb/875352/zh-cn,但是我这里要说的就是如何把它搞定:
我的电脑->属性->高级->启动和故障恢复->设置->要手动编辑启动选项,请单击“编辑”
在跳出来的boot.ini中,把/noexecute=optin修改为/noexecute=AlwaysOff。保存,重启机器,就好了。