2016-06-19 60 views
1

我正在用Lazarus構建一個應用程序,我使用sqlite數據庫來存儲數千條記錄。現在我通過sqlite3.dll動態鏈接到sqlite庫。Lazarus中的靜態鏈接sqlite

是否可以靜態鏈接到它?我在哪裏可以找到Lazarus兼容的lib文件來做到這一點?

注意: 我一個月前纔開始使用Lazarus和Free Pascal,所以對一個人來說看起來很明顯的東西,可能不適合我。所以請忍受一下。

乾杯

回答

3

實際靜態鏈接是困難的,因爲TSQLite3Connection組件固有地設計爲主動加載SQLite3的DLL。換句話說,當你編譯程序時,它不會鏈接到庫上,組件被編碼爲在運行時動態加載DLL。

如果你正在尋找一個完全獨立的程序,那麼你可以完成這兩種不同的方式。

  1. 創建一個新的TSQLite3Connection組件,它靜態鏈接到sqlite3而不是動態加載DLL。
  2. 將sqlite3.dll作爲資源包含在程序中,讓程序在運行之前自動部署它。

解決方案#1不是微不足道的,不是微不足道的。我已經完成了,我打算包含一個鏈接到組件,但結果並不穩定。問題是你必須編譯一個靜態版本的sqlite3,這不是一個真正的問題,但你必須在MinGW下使用像gcc這樣的工具來解決這個問題。在MinGW下使用gcc編譯意味着你必須在libgcc.a中鏈接,並且由於FreePascal的內部鏈接器不知道如何正確解釋stdcall符號,所以還必須鏈接到MinGW的libkernel32.a和libmsvcrt.a。結果只是不穩定。崩潰嘉豪。

解決方案#2應該相當容易,但拉撒路的維護人員會讓它變得有點困難。將dll作爲資源存儲在可執行文件中的部分很容易完成。所以寫出來作爲臨時文件。問題是你不能告訴TSQLite3Connection組件在哪裏找到它。所以它在可執行文件夾或系統文件夾中查找。這兩者都不一定是可執行文件寫入的。唯一可以保證程序能夠寫入的地方是臨時文件夾。所以我所做的是創建一個新版本的TSQLite3Connection組件調用TSQLite3DynConnection,這意味着您可以動態指定DLL的位置。我發佈了一個名爲ClientLibrary的屬性,您可以在其中指定dll的位置(它不必以.dll結尾,因此您可以使用系統臨時文件名生成例程)。您可以在以下位置獲得此組件:http://icculus.org/~kfitzner/misc/sqlite3dyndll.zip。它將針對Lazarus 1.6.2 FP 3.0.0或FP 1.0.6/FP 2.6.0進行編譯,這是我使用的兩個版本。

我會更新這個答案,如果我能得到靜態鏈接的版本穩定。

2016年12月2日更新:我設法得到static version穩定。

+0

我很抱歉,我甚至忘記了我問過這個問題。 我發佈這個問題後不久就與選項#2。 :) –

+0

我已經完成了一些相當長的時間,直到我最近在我的帽子裏發現了一個bug,最終做了一些事情。我有一個靜態版本,可以在今天穩定工作,並通過鏈接更新答案。 –