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
中,以便将所有文件名处理机制都清理干净

使用虚拟文件系统的更复杂方法是可能的,但需要更多的代码来解释。他们仍在做这类事情,但更多的诡计隐藏在视线之外