3

我正在尝试构建一个读取 Sqlite 数据库的 Tcl 应用程序。当我为应用程序构建一个 Starkit 并将 Sqlite 数据库文件放在 .vfs 文件夹中的 .tcl 文件旁边并尝试运行应用程序 (.exe) 时,我收到错误消息,“执行时找不到包 sqlite3包需要 sqlite3"。

我相信我的应用程序无法找到数据库文件。在构建 starkit 之前,.tcl 应用程序能够读取 Sqlite 数据库,但是在我创建 starkit 之后,.tcl 文件出现错误。

有谁知道如何使 Tcl 应用程序 Starkit 读取 Sqlite 数据库文件?

谢谢,

DFM

4

3 回答 3

5

我认为您的 starkit 更有可能无法加载 sqlite3 包。您是否在 .vfs 文件夹中创建了一个 lib 目录并将 sqlite3 包复制到其中?

于 2009-09-17T07:45:26.303 回答
4

这听起来像你在你的问题中讨论两个不同的事情。

首先是加载 sqllite3 库的能力。正如 Jackson 所指出的,您需要在您的 starpack 的 lib 目录中包含 sqllite3 库(tcl 和随附文件)。一旦正确完成,“package required sqlite3”命令应该可以正常工作。

第二个是关于-writable标志。如果我理解正确,那只允许您在运行时修改 starpack 中的文件。它与加载包含在starpack中的库的能力无关,但将用于允许该库修改文件(如您谈到的数据库文件)。

我的印象是,由于某些操作系统限制,无法写入正在运行的(a 中的文件)starkit。话虽如此,我从 Brent Welch 的惊人著作《Tcl 和 Tk 中的实用编程》中找到了以下内容:

如果您多次运行write.kit文件,您会注意到 write.kit/data.new 文件在运行之间不会持续存在。这是因为默认情况下,Metakit 数据库在主内存中进行修改,并且不会写入 Starkit 文件。如果要长期存储文件,请对 sdx 使用-writable标志:

sdx wrap write.kit writable

参考:谷歌图书

于 2009-09-17T13:28:22.167 回答
2

在所有回答我问题的人的帮助和一些深入研究的帮助下,我想出了创建一个用 Sqlite 后端包装 Tcl 应用程序的 starpack 的步骤。创建starpack的步骤如下:

  1. 下载并放置在一个文件夹tclkit-win32.upx.exesdx.kit.

  2. 制作副本tclkit-win32.upx.exe并将其重命名为tclkit.exe(保留在同一文件夹中)

  3. 将您的 .tcl( test.tcl) 应用程序添加到文件夹中(确保它具有代码package require sqlite.

  4. 运行tclkit-win32.upx.exe文件并在每行键入以下内容(完成后不要关闭):

    source sdx.kit
    package require sdx
    sdx::sdx qwrap test.tcl
    sdx::sdx unwrap test.kit
    
  5. 从 sqlite 网站下载tclsqlite3.dll并放在单独的文件夹中。命名文件夹sqlite

  6. 使用记事本之类的文本应用程序并添加以下代码:

    package ifneeded sqlite 3.6.18 [list load [file join $dir tclsqlite3.dll]].
    

    另存为pkgIndex.tcl并放置在带有tclsqlite3.dll.

  7. 进入第一步中的第一个文件夹。您应该会看到一个 .vfs 文件夹。打开 .vfs 文件夹,然后打开 lib 文件夹。将 sqlite 文件夹放在 lib 文件夹中。lib 文件夹应该有一个 app-test 文件夹(对应于test.tcl)和你的 sqlite 文件夹。

    步骤 5-7 的替代方法:将包含 sqlite dll 的文件夹从 C:\ 上的 tcl 文件夹复制到 lib 文件夹中。您可以使用验证 dll 的路径

      package ifneeded sqlite3 [package require sqlite3]
    

    sqlite 文件夹将有两个文件,一个 dll 文件和一个pkgIndex.tcl. 如果这样做,则必须package require sqlite3在步骤 3 中使用。

  8. tclkit-win32.upx.exe仍在运行的情况下,键入以下代码:

    sdx::sdx wrap test.exe -runtime tclkit.exe
    
  9. 最后,将您的 sqlite .db 文件放在新创建的应用程序 .exe (test.exe) 旁边并运行该应用程序。

确保注意版本冲突。package require sqlite我的代码片段存在重大问题。最初,我有package require sqlite3,但它不起作用。此外,当您创建pkgIndex.tcl文件时,请确保拥有正确版本的 sqlite(即 3.2.18 等...)。

谢谢大家的帮助。

DFM

于 2009-09-17T22:48:56.930 回答