Tcl Starkit和MySql

时间:2009-12-16 01:00:10

标签: mysql tcl

有谁知道MySql使用Tcl Starkit需要哪些文件?目前,我有libmySQL.dll,libmysqltcl.dll和pkgIndex.tcl。 pkgIndex.tcl具有以下代码:

proc loadmysqltcl {dir} {
   set oldcwd [pwd]
   cd $dir
   load libmysqltcl[info sharedlibextension]
   cd $oldcwd
  }

package ifneeded mysqltcl 3.03 [list loadmysqltcl $dir]

这些文件位于我的Tcl应用程序li​​b文件夹中。到目前为止,在我包装我的应用程序并运行exe之后。文件,我收到一个错误:

无法加载库 “C:/ ... TCL1055.tmp”:执行“load libmysqltcl [info sharedlibextension]”时,在库路径中找不到此库或从属库

此外,我注意到每次尝试运行应用程序时,丢失的.tmp文件都会更改。

Tcl / MySql starkit(适用于Windows)有没有人成功?

谢谢,

DFM

1 个答案:

答案 0 :(得分:6)

Starkits使用一些花哨的技巧,以便能够加载存储在捆绑到starkit本身的虚拟文件系统中的库。在Unix上,您可以指示OS库加载器从任意数据块加载库,但在Windows上,您只能从磁盘上的实际文件加载库。

为了适应这种限制,Windows starkits首先将库从虚拟文件系统复制到真实文件系统作为临时文件。这就是你的临时文件名来源。

现在,只要starkit中的库本身不依赖于starkit中的其他库,所有这些都可以正常工作。在您的情况下,您的libmysqltcl.dll可能依赖于libmySQL.dll。在加载时,这两个都已复制到真实文件系统,但具有临时文件名,因此加载器无法找到libmySQL.dll。

您可以选择解决此问题:

  1. 从库中消除这些二级依赖项。在这种情况下,这意味着使用与libmySQL.dll中的内容的静态链接重建libmysqltcl.dll,而不是将其与dll动态链接。

  2. 在启动脚本中包需要之前,将starkit中的第二级依赖项显式复制到真实文件系统上的某个位置,然后更新PATH环境变量以包含。目录

  3. 选项#2看起来像这样:

    set dirname [file dirname [info script]]
    set tmpdir  [file join $env(TEMP) __myapp__]
    file mkdir $tmpdir
    foreach dll {libmySQL.dll} {
        if { ![file exists [file join $tmpdir $dll]] } {
            file copy -force [file join $dirname bin $dll] $tmpdir
        }
    }
    set ::env(PATH) "$tmpdir;$env(PATH)"
    

    然后您应该能够按预期执行包需要

    确实有点笨拙,但是责任在于Windows,因为它不允许你从内存而不是从文件中加载libary代码。