从 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 中是合法的,但是 非常 令人讨厌并且不要那样做!)
我有一个 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 中是合法的,但是 非常 令人讨厌并且不要那样做!)