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