在Lazarus中静态链接sqlite

3
我正在使用Lazarus构建一个应用程序,其中使用sqlite数据库存储数千条记录。目前,我通过sqlite3.dll动态链接到sqlite库。是否可以静态链接到它?在哪里可以找到兼容Lazarus的lib文件呢?
注意:我只在一个月前开始使用Lazarus和Free Pascal,所以可能对一些看起来很明显的东西感到困惑。请耐心点。
干杯!
1个回答

4
实际的静态链接很困难,因为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应该相当容易,但Lazarus维护者让它有点难。将dll作为资源存储在可执行文件中的部分很容易做到。并且将其写入临时文件也很容易。问题是您无法告诉TSQLite3Connection组件在哪里找到它。因此,它会查找可执行文件夹或系统文件夹。这两个文件夹都不能被可执行文件写入。您唯一可以保证程序能够写入的地方是临时文件夹。所以我创建了一个名为TSQLite3DynConnection的TSQLite3Connection组件的新版本,意味着您可以动态指定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日更新:我成功地使静态版本稳定。

我很抱歉,我甚至忘记了自己提出了这个问题。在我发布这个问题后不久,我们选择了第二个选项。 :) - Anusha Dharmasena
1
我已经做了相同的事情很长一段时间,直到最近我突然有一个想法,决定终于采取行动。今天我已经成功地实现了静态版本,并更新了答案附带一个链接。 - Kurt Fitzner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接