Small. Fast. Reliable.
Choose any three.
SQLite合并

1.执行摘要

超过100个单独的源文件被合并为一个名为“ sqlite3.c”并称为“融合”的C代码大文件。合并包含应用程序嵌入SQLite所需的所有内容。合并文件的长度超过220,000行,大小超过7.5兆字节(截至2018-11-24)。

将SQLite的所有代码合并到一个大文件中,可使SQLite易于部署-仅需跟踪一个文件。而且由于所有代码都在一个翻译单元中,因此编译器可以更好地进行过程间优化,从而使机器代码的速度提高5%到10%。

2. SQLite合并

SQLite库在核心中包含102个C代码文件(版本3.9.0-2015-10-14),另外32个文件实现了FTS3FTS5RTREEDBSTATJSON1RBU扩展。在102个主要源文件中,大约75%是C代码,大约25%是C头文件。从它们存储在SQLite版本控制系统中 并在普通文本编辑器中手动编辑的意义上说,这些文件中的大多数都是“源”文件。但是某些C语言文件是使用脚本或辅助程序生成的。例如, parse.y 文件包含SQL语言的LALR(1)语法,该文件由Lemon解析器生成器编译为文件parse.c和parse.h中的 解析器

SQLite的makefile具有一个“ sqlite3.c”目标,用于构建我们称为“合并”的文件。合并是一个单独的C代码文件,名为“ sqlite3.c”,其中包含核心SQLite库以及FTS3FTS5RTREEDBSTATJSON1RBU扩展的所有C代码。该文件包含大约18.4万行代码(如果省略空白行和注释,则为113K),大小超过6.4兆字节。尽管“ sqlite3.c”合并文件中包含各种扩展名,但使用#ifdef语句将其禁用。使用以下编译时选项激活扩展:

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

合并不仅使SQLite更易于合并到其他项目中,还使其运行速度更快。当代码包含在单个翻译单元中(例如合并在一起)时,许多编译器便可以对代码进行其他优化。当我们使用合并功能编译SQLite而不是单独的源文件时,我们测得的性能提升介于5%到10%之间。不利的一面是,其他优化通常采用函数内联的形式,这倾向于使所得二进制图像的大小更大。

3.分裂合并

由于某些调试器只能处理少于32,768行的源代码行号,因此开发人员有时在调试185,000行的合并源文件时会遇到麻烦。合并源代码运行良好。一个人无法在调试器中单步调试它。

为了规避此限制,合并还可以采用拆分形式,包括文件“ 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配置
制作sqlite3.c

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

nmake / f makefile.msc sqlite3.c

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

5.1。依存关系

构建过程广泛使用了 Tcl脚本语言。您需要安装TCL的副本才能使上述生成目标起作用。可从http://www.tcl-lang.org/获得易于使用的安装程序。许多Unix工作站默认都安装了Tcl。

5.2。也可以看看

有关如何编译SQLite的其他说明,可以在“ 如何编译SQLite”页面上找到。