Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl Starkit与MySql_Mysql_Tcl - Fatal编程技术网

Tcl Starkit与MySql

Tcl Starkit与MySql,mysql,tcl,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 [

有人知道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应用程序库文件夹中。到目前为止,在我包装我的应用程序并运行exe之后。文件,我得到一个错误:

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

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

有人成功地使用了Tcl/MySql starkit(适用于Windows)吗

谢谢


DFM

starkit使用一些奇特的技巧,以便能够加载存储在绑定到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)"
    
    然后,您应该能够按照预期完成您的软件包要求


    这肯定有点笨重,但责任完全在于Windows不允许您从内存而不是文件加载库代码。

    谢谢Eric-我尝试了选项2,但运气不好。我将您的代码放在我的应用程序中的“package require mysqltcl”下面。然后我把它包起来,试着运行它,但运气不好。我还将您的代码放在pkgIndex.tcl文件中,无论是否包含所包含的代码,它都无法工作。听起来你的答案应该有用,所以我觉得我做错了什么。另外,我将“myapp”改为真正的应用程序名,即Small_Business_Database_应用程序。我希望名字中的下划线不会影响我的成绩。你有什么建议吗?谢谢,DFM此代码必须在“包要求”之前出现。另外,如果您将此代码放在进程中,请确保将“$env(TEMP)”更改为“$::env(TEMP)”。感谢您的后续操作。我真的很感谢你的帮助。现在一切正常。你好,DFM