我对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 "mytest"
while executing
"mytest abc"
(file "myscript.tcl" line 2)
我在Ubuntu 14.04上使用bash。 Tcl 8.6。
编辑1:我的问题/问题是我想将tclsh与脚本一起用作参数 - 这个脚本应该正确地加载扩展,以便mytest和其他已实现的函数正常工作。
编辑2:呃,如果我使用命令" source myscript.tcl"在tcl shell里面的结果是一样的。如果我使用myscript.tcl的绝对路径,错误仍然是相同的 - "加载"执行时没有警告,但我不确定,因为我得到无效的命令名称" mytest" 。也许问题在于范围,但是当交互使用tclsh时它正常工作。
答案 0 :(得分:1)
如果您在两种情况下都使用扩展库的完整路径,那么该部分应该完全相同。它可能正在做;如果它无法加载它,它会产生一个错误(这可能会或可能没有帮助,因为一些事情失败的方式提供的信息非常少; Tcl报告它已经得到了什么,但这有时是不够的,因为它取决于操作系统告诉它一些事情)。相反,问题可能在其他地方。
交互式使用和脚本式使用之间的主要区别在于,在交互式使用中,unknown
命令会将未知命令名称扩展为Tcl命令,您输入的内容是明确的前缀。这很方便,但是在转换为脚本时,应始终使用完整的命令名称。好的,不是完整完整的命令名称 - 你大多不希望或需要前面的::
命名空间 - 但没有缩写,所以不要使用lappe
lappend
。 (在交互式使用中,Tcl也将exec
作为外部程序,而不要求您明确键入exec
;再次,这在脚本中已关闭,因为它非常脆弱。)
可能是这是怎么回事?您可以在输入代码之前将全局变量tcl_interactive
设置为0
进行检查(我建议使用cut-n-paste进行输入,以便您知道完全什么正在进行中)。如果失败了,那就是绊倒你的互动模式的乐于助人。检查您可能拥有哪些命令作为info commands
前缀的扩展(当然,在load
之后):
info commands mytest*
如果那只是报告mytest
,我的理论是错误的。 (好吧,如果它这样做,并且该字符串的长度为6;理论上可以在命令名称上放置额外的不可见字符,这将是合法的Tcl但非常令人讨厌且 不要那么做! )