在linux中配置tcl环境是非常容易的,但是第一次做,走了一些弯路,现在记录下。
1、在linux中 apt-get install 安装的程序不一定是最新程序。
2、由于是通过apt-get install tcl 安装的tcl版本为8.5.11,又在http://www.activestate.com/activetcl/downloads下载了tcl的最新源码,编译安装了tcl,版本为8.6。在linux中自己手动安装tcl,步骤很清晰,记得看README,将tcl安装到了/usr/tcl8.6中,编译tcl扩展库libex.so,代码在后面:gcc -shared -o libex.so -DUSE_TCL_STUBS ex.c -I /usr/tcl8.6/include/tcl8.6 -L /usr/tcl8.6/lib -ltclstub8.6,一直编译失败,但是会提示 编译时添加 -fPIC ,于是编译成功,生成了 libex.so
3、在使用 libex.so时,又出错: package TCL 使用的是 tcl8.5.11 , 需要使用tcl8.6
4、利用 dpkg -l 查看安装的tcl版本,利用dpkg -r 将 tcl8.5 tk8.4 tcl8.4都卸载,如果卸载不干净,利用dpkg --purge 继续清除,如果还是清除不干净,就先将tcl8.6卸载,再清除。
5、最后重新编译tcl8.6 将bin下的tclsh copy到/usr/bin
代码:
<span style="font-size:14px;">//linux 下 简单的tcl扩展库实现
#include <stdio.h>
#include <tcl.h>
static int Hello_Cmd(ClientData cdate,Tcl_Interp *interp,int objc,Tcl_Obj *const objv[])
{
Tcl_SetObjResult(interp,Tcl_NewStringObj("Hello,World!",-1));
return TCL_OK;
}
int DLLEXPORT Ex_Init(Tcl_Interp *interp)
{
if(Tcl_InitStubs(interp,TCL_VERSION,0) == NULL)
{
return TCL_ERROR;
}
if(Tcl_PkgProvide(interp,"Hello","1.0") == TCL_ERROR)
{
return TCL_ERROR;
}
Tcl_CreateObjCommand(interp,"hello",Hello_Cmd,NULL,NULL);
return TCL_OK;
}</span>
加载使用tcl 扩展库 use.tcl
<span style="font-size:14px;">#!/usr/bin/tclsh
load [file join [pwd] libex[info sharedlibextension]]
puts [hello]</span>
另:windows 中 load [file join [pwd] foo.dll]最后运行程序
tclsh use.tcl