我正在尝试构建一个读取Sqlite数据库的Tcl应用程序。当我为应用程序构建一个starkit并将.scl数据库文件放在.vfs文件夹中的.tcl文件旁边并尝试运行应用程序(.exe)时,我收到错误,“执行时无法找到包sqlite3包需要sqlite3“。
我相信我的应用程序无法找到数据库文件。在构建starkit之前,.tcl应用程序能够读取Sqlite数据库,但在创建starkit之后,.tcl文件会出错。
有谁知道如何启用Tcl应用程序starkit来读取Sqlite数据库文件?
谢谢,
DFM
答案 0 :(得分:5)
我认为你的starkit更有可能无法加载sqlite3包。您是否在.vfs文件夹中创建了一个lib目录并将sqlite3包复制到其中?
答案 1 :(得分:4)
听起来你正在讨论你的问题中的两个不同的事情。
首先是加载sqllite3库的能力。如Jackson所述,您需要将sqllite3库(tcl和附带的文件)包含在starpack的lib目录中。一旦正确完成,“package required sqlite3”命令应该可以正常工作。
第二个是关于 -writable 标志。如果我理解正确,那只是允许你在starpack运行时修改文件。它与加载starpack中包含的库的能力无关,但可用于允许该库修改文件(如您所谈论的数据库文件)。
我的印象是,由于某些操作系统限制,无法写入正在运行的starkit(一个文件)。话虽如此,我从布伦特韦尔奇的惊人书籍“Tcl和Tk中的实用编程”中找到了以下内容:
如果多次运行 write.kit 文件,您会注意到write.kit / data.new文件在运行之间不会持续存在。这是因为,默认情况下,Metakit数据库在主内存中被修改,并且不会写入Starkit文件。如果要长期存储文件,请使用 -writable 标志来sdx:
sdx wrap write.kit writable
参考:Google Books
答案 2 :(得分:2)
在回复我的问题和一些深入研究的每个人的帮助下,我想出了创建一个包装带有Sqlite后端的Tcl应用程序的starpack的步骤。创建starpack的步骤如下:
下载并放置在tclkit-win32.upx.exe
和sdx.kit
文件夹中。
复制tclkit-win32.upx.exe
并将其重命名为tclkit.exe
(留在同一文件夹中)
将.tcl(test.tcl
)应用程序添加到该文件夹中(确保其代码为package require sqlite
。
运行tclkit-win32.upx.exe
文件并在每行输入以下内容(完成后不要关闭):
source sdx.kit
package require sdx
sdx::sdx qwrap test.tcl
sdx::sdx unwrap test.kit
从sqlite网站下载tclsqlite3.dll
并放在单独的文件夹中。将文件夹命名为sqlite
。
使用记事本等文字应用程序并添加以下代码:
package ifneeded sqlite 3.6.18 [list load [file join $dir tclsqlite3.dll]].
另存为pkgIndex.tcl
并将tclsqlite3.dll
放在sqlite文件夹中。
在第一步中进入第一个文件夹。您应该看到一个.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
。如果您这样做,则必须在步骤3中使用package require sqlite3
。
如果tclkit-win32.upx.exe
仍在运行,请输入以下代码:
sdx::sdx wrap test.exe -runtime tclkit.exe
最后,将sqlite .db文件放在新创建的应用程序.exe(test.exe)旁边,然后运行该应用程序。
确保观察版本冲突。我在package require sqlite
代码段中遇到了重大问题。最初,我有package require sqlite3
,这是行不通的。此外,当您创建pkgIndex.tcl
文件时,请确保使用正确版本的sqlite(即3.2.18等)。
感谢大家的帮助。
DFM