小巧、快速、可靠。
三者选其二。
SQLite 融合文件

1. 执行摘要

超过 100 个独立的源文件被连接到一个名为“sqlite3.c”的单个大型 C 代码文件中,称为“融合文件”。融合文件包含应用程序嵌入 SQLite 所需的一切。

将所有 SQLite 代码合并到一个大文件中使 SQLite 更容易部署——只需要跟踪一个文件。并且由于所有代码都在一个翻译单元中,编译器可以更好地进行跨过程和内联优化,从而生成速度快 5% 到 10% 的机器代码。

2. SQLite 融合文件

SQLite 库包含 111 个 C 代码文件(截至 版本 3.37.0 - 2021 年 11 月 27 日),位于核心部分,另外还有 22 个文件实现了一些常用的扩展。在 133 个主要源文件中,大约 75% 是 C 代码,大约 25% 是 C 头文件。大多数这些文件是“源”文件,因为它们存储在 SQLite 版本控制系统 中,并且在普通的文本编辑器中手动编辑。但一些 C 语言文件是使用脚本或辅助程序生成的。例如,parse.y 文件包含 SQL 语言的 LALR(1) 语法,该语法由 Lemon 解析器生成器 编译,以生成包含在“parse.c”文件中的解析器,并附带“parse.h”中的标记标识符。

SQLite 的 makefile 有一个“sqlite3.c”目标用于构建融合文件,以包含核心 SQLite 库和 FTS3FTS5RTREEDBSTATJSON1RBUSESSION 扩展的所有 C 代码。此文件包含大约 238K 行代码(如果您省略空白行和注释,则为 145K 行代码),大小超过 8.4 兆字节(截至 2021 年 12 月 29 日)。

虽然各种扩展包含在“sqlite3.c”融合文件中,但它们使用 #ifdef 语句被禁用。使用 编译时选项 激活扩展,例如

融合文件包含将 SQLite 集成到更大项目中所需的一切。只需将融合文件复制到您的源目录中,并将其与项目中的其他 C 代码文件一起编译。(关于编译过程的 更详细的讨论 可供参考。)您可能还想使用定义了 SQLite 编程 API 的“sqlite3.h”头文件。sqlite3.h 头文件单独提供。sqlite3.h 文件也包含在融合文件中,位于前几千行中。因此,如果您有 sqlite3.c 的副本但似乎无法找到 sqlite3.h,您始终可以通过从融合文件中复制和粘贴来重新生成 sqlite3.h。

除了使 SQLite 更容易合并到其他项目中之外,融合文件还可以使其运行得更快。当代码包含在一个翻译单元中(如融合文件中)时,许多编译器能够对代码进行额外的优化。我们已经测量了使用融合文件编译 SQLite 而不是单个源文件时性能提升 5% 到 10%。这样做 的缺点是,额外的优化通常以函数内联的形式出现,这往往会使生成的二进制映像的大小更大。

3. 拆分融合文件

开发人员有时在调试 25 万行融合文件源代码时遇到问题,因为一些调试器只能处理小于 32,768 的源代码行号。融合文件源代码运行良好。只是无法在调试器中单步执行。

为了规避此限制,融合文件也以拆分形式提供,包括“sqlite3-1.c”、 “sqlite3-2.c”等文件,其中每个文件少于 32,768 行代码,并且这些文件的连接包含完整融合文件的所有代码。然后,还有一个名为“sqlite3-all.c”的单独源文件,它基本上包含以下代码

#include "sqlite3-1.c"
#include "sqlite3-2.c"
#include "sqlite3-3.c"
#include "sqlite3-4.c"
#include "sqlite3-5.c"
#include "sqlite3-6.c"
#include "sqlite3-7.c"

使用拆分融合文件的应用程序只需编译“sqlite3-all.c”而不是“sqlite3.c”。这两个文件的工作原理完全相同。但是使用“sqlite3-all.c”,没有单个源文件包含超过 32,767 行代码,因此使用一些调试器更加方便。拆分融合文件的缺点是它包含 6 个 C 源代码文件而不是 1 个。

4. 下载预编译融合文件的副本

融合文件和 sqlite3.h 头文件在 下载页面 上作为名为 sqlite-amalgamation-X.zip 的文件提供,其中 X 被适当的版本号替换。

5. 从规范源代码构建融合文件

要构建融合文件(完整融合文件或拆分融合文件),首先从三个服务器之一 获取规范源代码。然后,在类 Unix 系统和安装了免费 MinGW 开发环境的 Windows 系统上,可以使用以下命令构建融合文件

sh configure
make sqlite3.c

要使用 Microsoft Visual C++ 构建,请运行以下命令

nmake /f makefile.msc sqlite3.c

在这两种情况下,可以通过将“sqlite3-all.c”替换为“sqlite3.c”作为 make 目标来获得拆分融合文件。

5.1. 依赖项

构建过程广泛使用 Tcl 脚本语言。您需要安装 Tcl 的副本才能使上面的 make 目标正常工作。易于使用的安装程序可以从 http://www.tcl-lang.org/ 获取。许多类 Unix 工作站默认情况下安装了 Tcl。

5.2. 另请参阅

有关编译 SQLite 的其他说明,请参见 如何编译 SQLite 页面。

本页面上次修改于 2023 年 8 月 3 日 14:10:55 UTC