gpt4 book ai didi

sqlite - Lazarus 中的静态链接 sqlite

转载 作者:行者123 更新时间:2023-12-03 16:58:26 32 4
gpt4 key购买 nike

我正在使用 Lazarus 构建一个应用程序,我在其中使用 sqlite 数据库来存储数千条记录。现在我正在通过 sqlite3.dll 动态链接到 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 应该相当简单,但 Lazarus 维护者让它变得有点困难。将 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稳定。

关于sqlite - Lazarus 中的静态链接 sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37912845/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com