The SQLite Amalgamation
SQLite 合并
1 执行摘要
将超过100个单独的源文件连接到名为 “sqlite3.c” 的 C 代码的单个大文件中,并称为“合并”。合并包含应用程序需要嵌入 SQLite 的所有内容。合并文件长度超过180,000行,大小超过6兆字节。
将 SQLite 的所有代码组合成一个大文件使得 SQLite 更容易部署 - 只需要一个文件来跟踪。由于所有代码都位于单个翻译单元中,因此编译器可以执行更好的程序间优化,从而使机器代码的速度提高5%至10%。
2. SQLite 合并
SQLite 库由核心中的102个 C 代码文件(截至版本3.9.0 - 2015-10-14)组成,其中32个附加文件实现 FTS3,FTS5,RTREE,DBSTAT,JSON1 和 RBU 扩展。在102个主要源文件中,大约75%是 C 代码,大约25%是 C 头文件。其中大部分是“源”文件,因为它们存储在 SQLite版本控制系统中,并且可以在普通文本编辑器中手动编辑。但是一些 C 语言文件是使用脚本或辅助程序生成的。例如,parse.y 文件包含一个 LALR(1)语法的 SQL 语言,该语法被编译成由 Lemon 解析器生成器生成的文件 “parse.c” 和 “parse.h” 中的解析器。
SQLite 的 makefile 有一个 “sqlite3.c” 目标,用于构建我们称之为“合并”的文件。合并是一个名为 “sqlite3.c” 的 C 代码文件,其中包含核心 SQLite 库以及 FTS3,FTS5,RTREE,DBSTAT,JSON1 和 RBU 扩展的所有C代码。该文件包含大约184K行代码(如果省略空行和注释,则为113K),并且大小超过6.4 MB。尽管各种扩展名都包含在 “sqlite3.c” 合并文件中,但它们使用 #ifdef 语句禁用。使用编译时选项来激活扩展,如:
- -DSQLITE_ENABLE_FTS3
- -DSQLITE_ENABLE_FTS5
- -DSQLITE_ENABLE_RTREE
- -DSQLITE_ENABLE_DBSTAT_VTAB
- -DSQLITE_ENABLE_JSON1
- -DSQLITE_ENABLE_RBU
合并包含将 SQLite 集成到更大项目中所需的一切。只需将合并代码复制到您的源代码目录中,并将其与您项目中的其他 C 代码文件一起编译。(有关编译过程的更详细讨论可用。)您可能还想使用定义 SQLite 编程 API 的 “sqlite3.h” 头文件。sqlite3.h 头文件单独提供。sqlite3.h 文件也包含在合并中,前几千行中。所以,如果你有一个 sqlite3.c 的副本,但似乎无法找到 sqlite3.h,你总是可以通过从合并中复制和粘贴来重新生成 sqlite3.h。
除了让 SQLite 更易于融入其他项目之外,合并还可以让它运行得更快。许多编译器可以在代码被包含在单个翻译单元中时进行额外的优化,例如在合并中。当我们使用合并来编译 SQLite 而不是单独的源文件时,我们已经测量了5%到10%之间的性能改进。这样做的缺点是额外的优化通常采用函数内联的形式,这往往会使得到的二进制图像的大小变大。
3.拆分合并
开发人员有时在调试185,000行长的合并源文件时遇到问题,因为有些调试器只能处理小于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。