Lazarus中的静态链接sqlite

问题描述:

我正在用Lazarus构建一个应用程序,我使用sqlite数据库来存储数千条记录。现在我通过sqlite3.dll动态链接到sqlite库。Lazarus中的静态链接sqlite

是否可以静态链接到它?我在哪里可以找到Lazarus兼容的lib文件来做到这一点?

注意: 我一个月前才开始使用Lazarus和Free Pascal,所以对一个人来说看起来很明显的东西,可能不适合我。所以请忍受一下。

干杯

实际静态链接是困难的,因为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,最终做了一些事情。我有一个静态版本,可以在今天稳定工作,并通过链接更新答案。 –