Tcl 我们可以从共享对象ie';*创建模块吗。因此';通过将其重命名为'$modulename-$version.tm';?
要从共享对象文件Tcl 我们可以从共享对象ie';*创建模块吗。因此';通过将其重命名为'$modulename-$version.tm';?,tcl,Tcl,要从共享对象文件x.so创建模块,以避免load命令。共享对象C源代码x.C定义包p,其中包含版本1 我将x.so重命名为p-1.tm,并将其路径添加到::tcl::tm::path中 使用的包装要求第1页 它显示错误,无法读取命令。这是因为主文件是x.so而不是x.tcl模块总是sourced。让它们包含一个可加载的库也需要一些技巧。这里有一条路。制作一个Tcl脚本,如下所示: apply {{scriptname realname} { set script [open $scrip
x.so
创建模块,以避免load
命令。共享对象C源代码x.C
定义包p
,其中包含版本1
我将x.so
重命名为p-1.tm
,并将其路径添加到::tcl::tm::path
中
使用的包装要求第1页
它显示错误,无法读取命令。这是因为主文件是x.so
而不是x.tcl
模块总是source
d。让它们包含一个可加载的库也需要一些技巧。这里有一条路。制作一个Tcl脚本,如下所示:
apply {{scriptname realname} {
set script [open $scriptname]
chan configure $script -eofchar \x1a
chan read $script
chan configure $script -translation binary
chan seek $script 1 current; # Reset EOF state and skip past the EOF character
set f [file tempfile filename $realname.so]
chan copy $script $f
chan close $f
chan close $script
tailcall load $filename $realname; # Used to find the _Init function
}} [info script] YourRealLibraryName
用ASCII EOF字符(Ctrl+Z)连接它,然后在最后连接真正的共享库,将其全部保存为模块文件。当脚本来源时,它会将库从其末端复制到一个临时文件中,并从该文件加载它
这取决于
source
始终将用于读取脚本的通道配置为使用EOF字符作为文件结束标记,即使在通常不使用它的系统上也是如此。然后,您可以读取过去的数据,并从中提取您想要的任何有效负载数据。在末尾连接一个可加载的库是很简单的,但是它需要在其他地方被提取出来,才能真正被送入load
。Tcl内部所有动态库的加载都要经过load
;这是唯一知道怎么做的命令。我们只是在为它做准备(默认情况下需要实际文件,因为我们将实际加载委托给执行此任务的操作系统库调用;file tempfile
非常适合此任务!)。最后,我们将所有内容包装在一个apply
和tailcall load
中,以便将所有文件名处理机制都清理干净
使用虚拟文件系统的更复杂方法是可能的,但需要更多的代码来解释。他们仍在做这类事情,但更多的诡计隐藏在视线之外