2009-09-16 65 views
3

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

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

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

感谢,

DFM

回答

5

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

+0

Hello Jackson - 谢谢你的回复。我只试图在.vfs文件夹中用.tcl文件打包.db文件。我将创建一个lib目录并从那里开始。当我包装我的应用程序时,我看到了某处可能需要包含的地方。这听起来很熟悉吗? – DFM 2009-09-17 13:12:21

4

这听起来像你正在讨论你的问题中的两个不同的东西。

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

第二个是关于可写入的标志。如果我的理解正确,这只允许您在Starpack运行期间修改Starpack中的文件。它与载入starpack中包含的库的能力无关,但会用于允许该库修改文件(如您所谈论的数据库文件)。

由于某些操作系统的限制,我的印象是无法写入正在运行的starkit文件(一个文件)。话虽这么说,我发现从布伦特·韦尔奇的惊人书“实用编程Tcl和Tk”以下内容:

如果运行write.kit文件多于一次,你会发现,write.kit/data.new文件在运行之间不会持久。这是因为,默认情况下,Metakit数据库在主内存中被修改,并且不会写入Starkit文件。如果你想存储文件长期使用-writable标志SDX:

sdx wrap write.kit writable 

Referece:Google Books

+0

您好RHSeeger - 感谢您的回复。我其实有这本书。我看到了这段摘录,但我不知道它是否适用于我正在尝试做的事情。我需要在我的starkit中放置一个.db文件(sqlite),以便代码片段“package required sqlite3”不会抛出错误。我解开了我的starkit并在其中找到了一个lib目录。vfs文件夹,然后我尝试将该.db文件放在该文件夹内的不同变体中,但无济于事。我不知道是否必须向.tcl文件添加更多代码,更改.db文件扩展名,在lib文件夹中创建特定文件夹等。 – DFM 2009-09-17 14:18:02

+0

编辑我的答案以解决您的评论。 – RHSeeger 2009-09-17 14:32:14

+0

我从sqlite的网站下载了一个tclsqlite3.dll文件。我相信这是需要放在starpack lib目录中的文件。我想我不明白这个文件需要放在哪里。 .vfs lib文件夹包含以下文件夹:dde,itcl3.4,Itcl,rechan,注册表,tcl8,tcl8.5,thread2.6.5,tk8.5,vfs1.3和zlib。我试着创建一个新文件夹(sqlite3),以及将tclsqlite3.dll文件放入列出的文件夹中。重新包装后,我试着运行应用程序,但我得到了同样的错误。 我真的很感激你的意见;谢谢。 – DFM 2009-09-17 14:55:59

2

在大家的帮助下谁回答我的问题和一些深入的研究,我想出了一些步骤来创建一个用Sqlite后端包装Tcl应用程序的Starpack。是创建starpack的步骤如下:文件夹tclkit-win32.upx.exesdx.kit

  1. 下载和地点。

  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. 使用文本应用程序如记事本,并添加以下代码:与tclsqlite3.dll

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

    另存为pkgIndex.tcl和发生在sqlite的文件夹中。

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

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

    package ifneeded sqlite3 [package require sqlite3] 
    

    SQLite的文件夹将有两个文件,DLL文件和pkgIndex.tcl验证DLL的路径。如果你这样说,你在步骤3

  8. 使用package require sqlite3随着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

+0

啊,所以你最终手动创建了pkgIndex.tcl文件。作为一个方面说明,通常认为向给你提供有用答案的人给予+1是有礼貌的。 – RHSeeger 2009-09-18 00:03:26