Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从tclsh加载tcl扩展_Tcl_Tclsh - Fatal编程技术网

从tclsh加载tcl扩展

从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 "

我有一个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。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*