1

我有一个在 unix 中使用 swig 创建的 .so(例如 abc.so)文件,我可以使用“load abc.so”将其加载到 tcl 程序中。我打算在windows下运行tcl程序,所以需要创建一个对应的abc.dll文件,类似的加载。请指导实现这一目标的过程。谢谢!

4

1 回答 1

0

如果您正在准备一个 DLL 中的 Tcl 扩展以进入 Starkit,那么您需要做的主要事情是确保该扩展是在stubs enabled mode中构建的。这有几个部分:

  1. USE_TCL_STUBS编译代码时需要定义 C 符号。如果您还使用 Tk API - 不太常见,但根据您的描述可能是正确的 - 您还需要指定USE_TK_STUBS. 这些符号通常最好使用编译器选项来指定,并且指定它们会导致 Tcl 将几乎所有 API 函数调用重写为存根调用。

  2. 您需要Tcl_InitStubs作为扩展程序的 init 函数的第一步调用,如果您使用的是 Tk API,那么您需要Tk_InitStubs作为第二步调用。这两个调用初始化存根 API 调用的绑定,以便它们指向真实的东西。请注意,当您的扩展程序不是以存根模式构建时,这些 API 调用也可以安全使用。

  3. 您需要链接到 Tcl(可能还有 Tk)存根库,它是一个静态库。这提供了存根调用的实现(以便它们调用宿主 Tcl 解释器内部的实现)和初始化函数。

这都是必要的,因为在一个starkit 中(就像在许多其他包装技术中一样)Tcl API 不是由通常的 Tcl DLL 实现的。相反,Tcl 代码被静态链接到一个可执行文件中,并且该可执行文件的名称在扩展构建时是不安全的;使用存根调用可以避免将库的文字名称绑定到您的代码中,这就是您不使用存根时出现问题的原因。


注意:只有 Tcl/Tk 扩展可以启用存根(除非完成工作的代码被复制和重用),因为绑定机制依赖于 Tcl 解释器上下文来将 API 描述符结构引用传送到正确的位置。非扩展库需要其他更先进的技术才能在打包环境中工作(处理它们的最简单方法通常是将它们静态绑定到包含 Tcl 扩展的 DLL,实际上总是包含相关 Tcl 的 DLL用于制作使用该功能的扩展的绑定层)。

于 2017-11-28T20:48:16.460 回答