有谁知道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应用程序lib文件夹中.到目前为止,在我包装我的应用程序并运行exe之后.文件,我收到一个错误:
无法加载库"C:/ ... TCL1055.tmp":执行"load libmysqltcl [info sharedlibextension]"时,在库路径中找不到此库或从属库
此外,我注意到每次尝试运行我的应用程序时,丢失的.tmp文件都会更改.
有人用Tcl/MySql starkit(对于Windows)有成功吗?
谢谢,
DFM
Starkits使用一些花哨的技巧,以便能够加载存储在捆绑到starkit本身的虚拟文件系统中的库.在Unix上,您可以指示OS库加载程序从任意数据块加载库,但在Windows上,您只能从磁盘上的实际文件加载库.
为了适应这种限制,Windows starkits首先将库从虚拟文件系统复制到真实文件系统作为临时文件.这就是你的临时文件名来自哪里.
现在,只要starkit中的库本身不依赖于starkit中的其他库,所有这些都可以正常工作.在您的情况下,您的libmysqltcl.dll可能依赖于libmySQL.dll.在加载时,这两个都已复制到真正的文件系统,但具有临时文件名,因此加载器无法找到libmySQL.dll.
你有两个选择来解决这个问题:
消除库中的这些二级依赖项.在这种情况下,这意味着重建libmysqltcl.dll与libmySQL.dll中的东西的静态链接,而不是动态链接它与DLL.
在启动脚本中包需要之前,将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代码.