我正在用Lazarus构建一个应用程序,在那里我使用sqlite数据库来存储数千条记录。现在我通过sqlite3.dll动态链接到sqlite库。可以静态链接吗?我在哪里可以找到Lazarus兼容的lib文件来做这件事?
欢呼
nimxete21#
实际的静态链接是困难的,因为TSQLite 3Connection组件本身就设计为主动加载SQLite3 DLL。换句话说,当您编译程序时,它并没有链接到库,组件被编码为在运行时动态加载DLL。如果你正在寻找一个完全独立的程序,那么你可以通过两种不同的方式来实现这一点。1.创建一个新的TSQLite 3Connection组件,该组件静态链接到sqlite3,而不是动态加载DLL。1.将sqlite3.dll作为资源包含在程序中,并让程序在运行前自动部署它。解决方案#1不是微不足道的,不适合胆小的人。我已经这样做了,我打算包括一个链接到组件,但结果是不稳定的。问题是,你必须编译一个静态版本的sqlite3,这不是一个真实的问题,但你必须在MinGW下用gcc这样的东西来做,这就引入了问题。在MinGW下用gcc编译意味着你必须链接libgcc.a,因为FreePascal的内部链接器不知道如何正确解释stdcall符号,你还必须链接MinGW的libkernel32.a和libmsvcrt.a。结果并不稳定。大量崩溃。解决方案#2应该相当容易,但Lazarus维护者使它有点困难。将dll作为资源存储在可执行文件中的部分很容易做到。把它写成一个临时文件也是一样。问题是你不能告诉TSQLite 3Connection组件在哪里找到它。因此,它会在可执行文件的文件夹或系统文件夹中查找。可执行文件不一定能写入这两者。你唯一能保证你的程序可以写入的地方是一个临时文件夹。因此,我所做的是创建一个新版本的TSQLite 3Connection组件TSQLite 3DynConnection,这意味着您可以动态指定DLL的位置。我创建了一个名为ClientLibrary的已发布属性,您可以在其中指定dll的位置(它不必以.dll结尾,因此您可以使用系统临时文件名生成例程)。您可以在以下位置获得此组件:https://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稳定。
1条答案
按热度按时间nimxete21#
实际的静态链接是困难的,因为TSQLite 3Connection组件本身就设计为主动加载SQLite3 DLL。换句话说,当您编译程序时,它并没有链接到库,组件被编码为在运行时动态加载DLL。
如果你正在寻找一个完全独立的程序,那么你可以通过两种不同的方式来实现这一点。
1.创建一个新的TSQLite 3Connection组件,该组件静态链接到sqlite3,而不是动态加载DLL。
1.将sqlite3.dll作为资源包含在程序中,并让程序在运行前自动部署它。
解决方案#1不是微不足道的,不适合胆小的人。我已经这样做了,我打算包括一个链接到组件,但结果是不稳定的。问题是,你必须编译一个静态版本的sqlite3,这不是一个真实的问题,但你必须在MinGW下用gcc这样的东西来做,这就引入了问题。在MinGW下用gcc编译意味着你必须链接libgcc.a,因为FreePascal的内部链接器不知道如何正确解释stdcall符号,你还必须链接MinGW的libkernel32.a和libmsvcrt.a。结果并不稳定。大量崩溃。
解决方案#2应该相当容易,但Lazarus维护者使它有点困难。将dll作为资源存储在可执行文件中的部分很容易做到。把它写成一个临时文件也是一样。问题是你不能告诉TSQLite 3Connection组件在哪里找到它。因此,它会在可执行文件的文件夹或系统文件夹中查找。可执行文件不一定能写入这两者。你唯一能保证你的程序可以写入的地方是一个临时文件夹。因此,我所做的是创建一个新版本的TSQLite 3Connection组件TSQLite 3DynConnection,这意味着您可以动态指定DLL的位置。我创建了一个名为ClientLibrary的已发布属性,您可以在其中指定dll的位置(它不必以.dll结尾,因此您可以使用系统临时文件名生成例程)。您可以在以下位置获得此组件:https://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稳定。