从 tclsh 加载 tcl 扩展

Loading tcl extension from 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 "mytest"
    while executing
"mytest abc"
    (file "myscript.tcl" line 2)

我在 Ubuntu 14.04 上使用 bash。 Tcl 8.6.

编辑 1:我的 question/problem 是我想将 tclsh 与脚本一起用作参数 - 该脚本应该以 mytest 和其他已实现的函数正常工作的方式正确加载扩展。

编辑 2:呃,如果我在 tcl shell 中使用命令 "source myscript.tcl",结果是一样的。如果我对 myscript.tcl 使用绝对路径,错误仍然相同 --- "load" 在没有警告的情况下执行,但我不确定,因为我得到 invalid command name "mytest"。也许问题出在作用域上,但是当以交互方式使用 tclsh 时它工作正常。

如果您在这两种情况下都使用扩展库的完整路径,则该部分的工作方式应该相同。它可能正在做;如果它不能加载它,它会产生一个错误(这可能有帮助也可能没有帮助,因为事情失败的一些方式提供的信息很少;Tcl 报告它得到了什么,但有时这还不够,因为它依赖于 OS 来告诉它一些事情)。相反,问题可能出在其他地方。

交互式使用和脚本式使用的主要区别在于,在交互式使用中,unknown 命令会将未知的命令名称扩展为 Tcl 命令,即您键入的内容是 明确的的前缀。这很方便,但是在转换为脚本时,您应该始终使用完整的命令名称。好的,不是 full 完整的命令名称——你大多不想要或不需要前面的 :: 命名空间——但没有缩写,所以不要使用 lappe 对于 lappend。 (在交互式使用中,Tcl 也将 exec 作为外部程序,而不需要您明确键入 exec;同样,它在脚本中被关闭,因为它相当脆弱。)

莫非是这回事?您可以在输入代码之前通过将全局变量 tcl_interactive 设置为 0 来进行检查(我建议使用 cut-n-paste 进行输入,这样您就可以准确地知道 发生了什么)。如果失败了,那就是交互模式的帮助让你失望了。检查您可能有哪些命令作为带有 info commands 的前缀的扩展(当然在 load 之后):

info commands mytest*

如果只是报告mytest,我的理论是错误的。 (好吧,如果它这样做并且该字符串的长度是 6;理论上可以在命令名称上放置额外的不可见字符,这在 Tcl 中是合法的,但是 非常 令人讨厌并且不要那样做!)