Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lazarus中的静态链接sqlite_Sqlite_Static Linking_Lazarus - Fatal编程技术网

Lazarus中的静态链接sqlite

Lazarus中的静态链接sqlite,sqlite,static-linking,lazarus,Sqlite,Static Linking,Lazarus,我正在用Lazarus构建一个应用程序,我使用sqlite数据库存储数千条记录。现在,我正在通过sqlite3.dll动态链接到sqlite库 可以静态链接到它吗?我在哪里可以找到Lazarus兼容的lib文件来实现这一点 注: 我一个月前才开始使用Lazarus和Free Pascal,所以有些东西对我来说可能很明显,但对我来说可能不合适。所以请容忍我一点 Cheers由于TSQLite3Connection组件固有地设计为主动加载SQLite3 DLL,因此实际的静态链接很困难。换句话说,在

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

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

注: 我一个月前才开始使用Lazarus和Free Pascal,所以有些东西对我来说可能很明显,但对我来说可能不合适。所以请容忍我一点


Cheers

由于TSQLite3Connection组件固有地设计为主动加载SQLite3 DLL,因此实际的静态链接很困难。换句话说,在编译程序时,它没有与库链接,组件被编码为在运行时动态加载DLL

如果你希望有一个完全独立的程序,那么你可以用两种不同的方法来完成

  • 创建一个新的TSQLite3Connection组件,该组件静态链接sqlite3,而不是动态加载DLL
  • 将sqlite3.dll作为资源包含在程序中,并让程序在运行前自动部署它
  • 解决方案#1并不琐碎,也不适合胆小的人。我已经这样做了,我打算包含一个到组件的链接,但结果并不稳定。问题是您必须编译sqlite3的静态版本,这不是一个真正的问题,但是您必须在MinGW下使用类似gcc的东西来编译,这会带来问题。在MinGW下使用gcc编译意味着您必须在libgcc.a中进行链接,因为FreePascal的内部链接器不知道如何正确解释stdcall符号,所以您还必须链接MinGW的libkernel32.a和libmsvcrt.a。结果就是不稳定。撞车事件很多

    解决方案2应该相当简单,但Lazarus的维护人员让它变得有点困难。将dll作为资源存储在可执行文件中的部分很容易做到。将其写入临时文件也是如此。问题是,您无法告诉TSQLite3Connection组件之后在哪里可以找到它。因此,它会在可执行文件的文件夹或系统文件夹中查找。可执行文件不一定能写入其中任何一个。唯一可以保证程序能够写入的地方是临时文件夹。因此,我所做的是创建了一个新版本的TSQLite3Connection组件,称为TSQLite3DynConnection,这意味着您可以动态指定DLL的位置。我创建了一个名为ClientLibrary的已发布属性,您可以在其中指定dll的位置(它不必以.dll结尾,因此您可以使用系统临时文件名生成例程)。您可以在以下位置获取此组件:。它将针对Lazarus 1.6.2 FP 3.0.0或FP 1.0.6/FP 2.6.0进行编译,这是我使用的两个版本

    如果静态链接的版本稳定,我会更新这个答案


    2016年12月2日更新:我成功地获得了稳定。

    我甚至忘记了我问过这个问题,对此我深表歉意。在我发布此问题后不久,我们选择了选项2我已经做了一些很长一段时间了,直到最近我的帽子里有了一个bug,我终于可以做点什么了。我今天得到了一个稳定的静态版本,并用一个链接更新了答案。