在 Windows 中为 tcl/tk starkit 创建 .dll

标签 c dll tcl starkit

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

最佳答案

如果您正在准备 DLL 中的 Tcl 扩展以进入 starkit,您需要做的主要事情是确保该扩展是在 stub 启用模式 中构建的。这有几个部分:

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

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

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

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


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

关于在 Windows 中为 tcl/tk starkit 创建 .dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47536986/

相关文章:

ASP.Net 无法在 PRODUCTION 中创建/卷影副本

shell - 使用 TCL 的 tk_getOpenFile 压缩多个文件

linux - 如何使用 Tcl/Expect 从文件中删除与模式匹配的行

c - pthread_mutex_lock() 上的段错误

c++ - CvCaptureFromFile(..) 的源代码

c# - 从另一个 AppDomain 接收程序集引用时出现异常

linux - 如何在 Tcl 中安装软件包?

c - 使用命令行参数读取文本文件不起作用

c - 从丢失的 TCP 连接中恢复传输

c++ - 在网络浏览器中运行 C/C++ 代码?