从tclsh加载tcl扩展
我有一个Tcl的C扩展,其中定义了命令mytest。扩展编译正确(我在Linux上,扩展名是*.so)。例如,我可以启动tclsh并像这样使用它:从tclsh加载tcl扩展,tcl,tclsh,Tcl,Tclsh,我有一个Tcl的C扩展,其中定义了命令mytest。扩展编译正确(我在Linux上,扩展名是*.so)。例如,我可以启动tclsh并像这样使用它: $ tclsh % load /path/extension.so % mytest abc ... 但是,如果我创建一个包含以下内容的文件myscript.tcl: load /path/extension.so mytest abc 然后我得到一个错误: $ tclsh myscript.tcl invalid command name "
$ tclsh
% load /path/extension.so
% mytest abc
...
但是,如果我创建一个包含以下内容的文件myscript.tcl:
load /path/extension.so
mytest abc
然后我得到一个错误:
$ tclsh myscript.tcl
invalid command name "mytest"
while executing
"mytest abc"
(file "myscript.tcl" line 2)
我正在Ubuntu 14.04上使用bash。tcl8.6
编辑1:我的问题是,我想将tclsh与脚本一起用作参数-此脚本应正确加载扩展,以使mytest和其他实现的函数能够正常工作
编辑2:Uhh,如果我在tclshell中使用命令“sourcemyscript.tcl”,结果是一样的。如果我对myscript.tcl使用绝对路径,错误仍然是一样的---“load”在没有警告的情况下执行,但我不确定,因为我得到了无效的命令名“mytest”。问题可能出在作用域上,但当交互使用tclsh时,它工作正常。如果在这两种情况下都使用扩展库的完整路径,则该部分的工作方式应该相同。但它可能正在这样做;如果它无法加载它,它将生成一个错误(这可能会有帮助,也可能没有帮助,因为某些失败的方式提供的信息很少;Tcl报告它得到的信息,但有时这还不够,因为它依赖于操作系统来告诉它一些事情)。相反,问题可能在别处 交互式使用和脚本化使用之间的主要区别在于,在交互式使用中,
unknown
命令将未知命令名称扩展为Tcl命令,您键入的内容是一个明确的前缀。这很方便,但在转换为脚本时,应始终使用完整的命令名。好的,不是完整的命令名-您通常不希望或不需要前面的:
名称空间-但是没有缩写,所以不要将lappe
用于lappend
。(在交互式使用中,Tcl还将exec
作为外部程序,而无需显式键入exec
;同样,这在脚本中关闭,因为它相当脆弱。)
会不会就是这样?在输入代码之前,您可以通过将全局变量tcl_interactive
设置为0
进行检查(我建议使用剪切粘贴进行输入,这样您就可以确切地知道输入的内容)。如果失败了,那就是交互模式的帮助让你绊倒了。检查哪些命令可以作为前缀info commands
的扩展(当然,在加载之后):
如果那只是报告我的测试,我的理论是错误的。(好吧,如果它这样做了,并且字符串的长度是6;理论上可能在命令名上添加了额外的不可见字符,这将是合法的Tcl,但非常讨厌,不要这样做!)问题到底是什么?当您在Tcl shell中生成文件时会发生什么?谢谢。我知道脚本中的缩写词,例如“put”和“put”都可以交互工作,但脚本中只能使用“put”。但是,如果在“加载”之前使用“set tcl_interactive 0”,则新命令不可用。我有一个截图,我应该发布它吗?哦,我刚刚发现,事实上,我对缩写词有问题。命令mytest实际上是mytestPkg。。。问题解决了!
info commands mytest*