Tcl Starkit和MySql

DFM*_*DFM 2 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]
Run Code Online (Sandbox Code Playgroud)

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

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

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

有人用Tcl/MySql starkit(对于Windows)有成功吗?

谢谢,

DFM

Eri*_*ski 6

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

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

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

你有两个选择来解决这个问题:

  1. 消除库中的这些二级依赖项.在这种情况下,这意味着重建libmysqltcl.dll与libmySQL.dll中的东西的静态链接,而不是动态链接它与DLL.

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

选项#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)"
Run Code Online (Sandbox Code Playgroud)

然后,您应该能够按预期执行包裹要求.

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