2009-12-16 108 views
2

有誰知道MySql需要哪些文件才能使用Tcl Starkit?目前,我有libmySQL.dll,libmysqltcl.dll和pkgIndex.tcl。 pkgIndex.tcl包含以下代碼:Tcl Starkit和MySql

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

回答

6

Starkits使用一些花哨的技巧,以便能夠加載存儲在捆綁到starkit本身的虛擬文件系統庫。在Unix上,您可以指示OS庫加載程序從任意數據塊加載庫,但在Windows上,只能從磁盤上的實際文件加載庫。

爲了適應該限制,Windows starkits首先將庫從虛擬文件系統複製到實際文件系統作爲臨時文件。這就是您臨時文件名稱的來源。

現在,只要你的starkit中的庫本身不依賴於你的starkit中的其他庫,所有這些工作都可以正常工作。在你的情況下,你的libmysqltcl.dll可能依賴於libmySQL.dll。在加載時,它們都被複制到真正的文件系統中,但是使用臨時文件名,所以加載程序無法找到libmySQL.dll。

你有幾個選擇爲解決此工作:

  1. 從庫中消除這些第二級依賴。在這種情況下,這意味着重建libmysqltcl.dll與libmySQL.dll中的東西靜態鏈接,而不是動態鏈接到DLL。

  2. 包之前需要在你的啓動腳本,明確第二級依賴你的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,因爲它不允許您從內存而不是從文件加載庫文件。

+0

謝謝埃裏克 - 我試過選項2沒有運氣。我把你的代碼放在我的應用程序的「package require mysqltcl」下面。然後我把它包起來,試着運行它,但沒有運氣。我還將你的代碼放在pkgIndex.tcl文件中,不管是否包含代碼,它都不起作用。這聽起來像你的答案應該工作,所以我認爲我做錯了什麼。另外,我將「_myapp_」更改爲真正的應用程序名稱,即Small_Business_Database_application。我希望名字中的下劃線不會影響我的結果。你有什麼建議嗎? 謝謝, DFM – DFM 2009-12-16 14:34:51

+0

此代碼必須在「包需求」之前。另外,如果你把這段代碼放在proc中,一定要把「$ env(TEMP)」改爲「$ :: env(TEMP)」。 – 2009-12-16 17:47:28

+0

謝謝你的跟進。我非常感謝你的幫助。現在一切正常。 Regards, DFM – DFM 2009-12-17 00:01:57