一、执行摘要
超过 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.c”中的标记标识符。 H”。
SQLite 的 makefile 有一个用于构建合并的“sqlite3.c”目标,以包含核心 SQLite 库和 FTS3、FTS5、RTREE、DBSTAT、JSON1、 RBU和SESSION 扩展的所有 C 代码。该文件包含大约 238K 行代码(如果省略空行和注释,则为 145K),大小超过 8.4 兆字节(截至 2021 年 12 月 29 日)。
尽管“sqlite3.c”合并文件中包含各种扩展,但使用#ifdef 语句禁用它们。使用编译时选项激活扩展,例如:
- -DSQLITE_ENABLE_FTS3
- -DSQLITE_ENABLE_FTS5
- -DSQLITE_ENABLE_RTREE
- -DSQLITE_ENABLE_DBSTAT_VTAB
- -DSQLITE_ENABLE_JSON1
- -DSQLITE_ENABLE_RBU
- -DSQLITE_ENABLE_SESSION
合并包含将 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.c”替换为“sqlite3-all.c”作为make目标来获得拆分合并。
5.1. 依赖关系
构建过程广泛使用了 Tcl脚本语言。您需要安装一份 TCL 才能使上面的 make 目标工作。可以从http://www.tcl-lang.org/获得易于使用的安装程序。许多 unix 工作站默认安装了 Tcl。
5.2. 也可以看看
有关编译 SQLite 的其他说明,请参见 如何编译 SQLite页面。