1

I have a C extension to Tcl where command mytest is defined. The extension is compiled correctly (I am on Linux, extension is *.so). For example, I can start tclsh and use it like this:

$ tclsh
% load /path/extension.so
% mytest abc
...

But, if I create a file myscript.tcl with the following content:

load /path/extension.so
mytest abc

then I get error:

$ tclsh myscript.tcl 
invalid command name "mytest"
    while executing
"mytest abc"
    (file "myscript.tcl" line 2)

I am using bash on Ubuntu 14.04. Tcl 8.6.

EDIT 1: My question/problem is that I want to use tclsh with a script as an argument - this script should properly load extensions in such a way that mytest and other implemented functions are working without error.

EDIT 2: Uhh, If I use command "source myscript.tcl" inside tcl shell the result is the same. If I use absolute path for myscript.tcl the error is still the same --- "load" executes without warning but I am not sure about it because I get invalid command name "mytest". Maybe the problem is with scope, but it is working correctly when tclsh is used interactively.

4

1 回答 1

1

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

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

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

info commands mytest*

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

于 2015-03-07T08:28:44.603 回答