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

在windows中为tcl/tk starkit创建.dll,c,dll,tcl,starkit,C,Dll,Tcl,Starkit,我有一个在unix中使用swig创建的.so(例如abc.so)文件,我希望使用“load abc.so”将其加载到tcl程序中。我计划在windows中运行tcl程序,因此需要创建相应的abc.dll文件,该文件可以类似地加载。Kindy指导实现这一点的程序。谢谢 如果要在DLL中准备Tcl扩展以进入starkit,则需要做的主要事情是确保该扩展是在启用存根的模式下构建的。这有几个部分: 编译代码时,需要定义C符号使用\u TCL\u STUBS。如果您也在使用Tk API—不太常见,但根据您

我有一个在unix中使用swig创建的.so(例如abc.so)文件,我希望使用“load abc.so”将其加载到tcl程序中。我计划在windows中运行tcl程序,因此需要创建相应的abc.dll文件,该文件可以类似地加载。Kindy指导实现这一点的程序。谢谢

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

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

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

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

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



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

  • 编译代码时,您需要定义C符号
    USE_TCL_STUBS
    。如果您也使用Tk API-不太常见,但根据您的描述可能是正确的-您还需要指定
    USE_TCL_STUBS
    。这些符号通常最好使用编译器选项指定,指定它们会导致TCL重写虚拟代码将所有API函数调用合并到存根调用中

  • 您需要调用
    Tcl_InitStubs
    作为扩展的init函数的第一步,如果您使用的是Tk API,那么您需要调用
    Tk_InitStubs
    作为第二步。这两个调用初始化存根API调用的绑定,以便它们指向真实的对象。请注意,在您的扩展不是以存根模式构建的

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

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



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

    非常感谢Donal,我的一个基本问题是如何以及在何处创建.dll文件。我遇到了各种方法,如mingw和cygwin,你能为创建.dll文件的工作方法或过程提供指导吗Donal,我的一个基本问题是如何以及在何处创建.dll文件。我遇到了各种方法像mingw和cygwin一样,您可以指导创建.dll的工作方法或过程吗