首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

How To Compile SQLite

1.合并与单个源文件

2.编译命令行界面

3.编译TCL接口

4.建立融合

5.构建Windows DLL

如何编译SQLite

概观

SQLite是ANSI-C源代码。在它有用之前,它必须被编译成机器代码。本文是编译SQLite的各种方式的指南。

本文不包含编译SQLite的详细步骤。由于每个发展情况都不同,这将很困难。相反,本文描述和说明SQLite编译背后的原理。典型的编译命令作为示例提供,期望应用程序开发人员可以使用这些示例作为开发自己的自定义编译过程的指导。换句话说,这篇文章提供了一些想法和见解,而不是交钥匙解决方案。

SQLite是由超过一百个C代码文件和脚本构建而成的,分布在多个目录中。SQLite的实现是纯粹的ANSI-C,但是许多C语言源代码文件在被合并到完成的SQLite库之前可以由辅助C程序和AWK,SED和TCL脚本生成或转换。构建必要的C程序和转换和/或创建SQLite的C语言源代码是一个复杂的过程。

为了简化问题,SQLite也可以作为预先打包的合并源代码文件:sqlite3.c。合并是实现整个SQLite库的ANSI-C代码的单个文件。合并更容易处理。所有内容都包含在一个单独的代码文件中,因此很容易将其放入较大的C或C ++程序的源代码树中。所有的代码生成和转换步骤已经完成,所以没有辅助的C程序来配置和编译,也没有脚本可以运行。而且,由于整个库都包含在一个翻译单元中,因此编译器可以进行更高级的优化,从而使性能提高5%到10%。由于这些原因,合并源文件(“ sqlite3.c“)被推荐用于所有应用程序。

所有应用都推荐使用合并

直接从单个源代码文件构建SQLite当然是可能的,但不推荐。对于某些专门的应用程序,可能需要修改构建过程,这种方式无法仅使用从网站下载的预先构建的合并源文件完成。对于这些情况,建议建立一个定制的合并(如下所述)并使用。换句话说,即使项目需要以单个源文件开始构建SQLite,仍然建议使用合并源文件作为中间步骤。

构建命令行界面需要三个源文件:

  • sqlite3.c:SQLite合并源文件
  • sqlite3.hsqlite3.c附带的头文件,它定义了SQLite的C语言接口。
  • shell.c:命令行界面程序本身。这是C源代码文件,其中包含main()例程的定义以及提示用户输入的循环,并将该输入传递到SQLite数据库引擎进行处理。

上述所有三个源文件都包含在下载页面上提供的合并tarball中

要构建CLI,只需将这三个文件放在同一目录中并将它们一起编译。使用MSVC:

代码语言:javascript
复制
cl shell.c sqlite3.c -Fesqlite3.exe

在unix系统(或使用cygwin或mingw + msys的Windows上),该命令通常看起来像这样:

代码语言:javascript
复制
gcc shell.c sqlite3.c -lpthread -ldl

为了使SQLite线程安全,需要pthreads库。但由于CLI是单线程的,因此我们可以指示SQLite以非线程安全模式构建,从而省略pthreads库:

代码语言:javascript
复制
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl

需要-ldl库来支持动态加载,sqlite3_load_extension()接口和load_extension()SQL函数。如果这些功能不是必需的,那么可以使用SQLITE_OMIT_LOAD_EXTENSION编译时选项省略它们:

代码语言:javascript
复制
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c

有人可能希望提供其他编译时选项,例如用于全文搜索的-DSQLITE_ENABLE_FTS4或-DSQLITE_ENABLE_FTS5,用于R * Tree搜索引擎扩展的-DSQLITE_ENABLE_RTREE,用于包括JSON SQL函数的-DSQLITE_ENABLE_JSON1或用于dbstat虚拟表的-DSQLITE_ENABLE_DBSTAT_VTAB 。为了在EXPLAIN列表中看到额外的评论,添加-DSQLITE_ENABLE_EXPLAIN_COMMENTS选项。在unix系统上,如果主机支持usleep()系统调用,则添加-DHAVE_USLEEP = 1。添加-DHAVE_READLINE和-lreadline和-lncurses库以获得命令行编辑支持。有人可能也想指定一些编译器优化开关。(可从SQLite网站下载的预编译CLI使用“-Os”。)这里有无数种可能的变体。

代码语言:javascript
复制
gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS4 \
   -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 \
   -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
   -DHAVE_USLEEP -DHAVE_READLINE \
   shell.c sqlite3.c -ldl -lreadline -lncurses -o sqlite3

关键在于:构建CLI包括将两个C语言文件编译在一起。该shell.c文件包含入口点的定义和用户输入回路和SQLite的融合sqlite3.c包含了SQLite库的完整实现。

SQLite的TCL接口是一个添加到常规合并中的小模块。结果是一个名为“ tclsqlite3.c ” 的新的合并源文件。这个单一的源文件是生成一个共享库所需要的,它可以加载到标准的tclsh希望使用TCL加载命令,或者生成一个随SQLite内置的独立tclsh。tcl合并的一个副本是作为TEA tarball中的文件包含在下载页面中。

要在Linux上为SQLite生成一个TCL可加载的库,以下命令就足够了:

代码语言:javascript
复制
gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl

不幸的是,为Mac OS X和Windows构建共享库并不那么简单。对于这些平台,最好使用TEA tarball中包含的configure脚本和makefile 。

要生成与SQLite静态链接的独立tclsh,请使用以下编译器调用:

代码语言:javascript
复制
gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm

这里的技巧是-DTCLSH = 1选项。用于SQLite的TCL接口模块包含一个main()过程,用于初始化TCL解释器并在编译时使用-DTCLSH = 1进入命令行循环。上述命令适用于Linux和Mac OS X,但可能需要根据平台和TCL的哪个版本链接来调整库选项。

下载页面上提供的SQLite合并版本对大多数用户来说通常是足够的 但是,一些项目可能需要或需要建立自己的合并。构建自定义合并的一个常见原因是为了使用某些编译时选项来自定义SQLite库。回想一下,SQLite合并包含很多由辅助程序和脚本生成的C代码。许多编译时选项会影响此生成的代码,并且在汇编合并之前必须提供给代码生成器。必须传递到代码生成器中的编译时选项集可以从一个SQLite版本到下一个版本不同,但在编写本文时(大约SQLite 3.6.20,2009-11-04),该选项集代码生成器必须知道的内容包括:

  • SQLITE_ENABLE_UPDATE_DELETE_LIMIT
  • SQLITE_OMIT_ALTERTABLE
  • SQLITE_OMIT_ANALYZE
  • SQLITE_OMIT_ATTACH
  • SQLITE_OMIT_AUTOINCREMENT
  • SQLITE_OMIT_CAST
  • SQLITE_OMIT_COMPOUND_SELECT
  • SQLITE_OMIT_EXPLAIN
  • SQLITE_OMIT_FOREIGN_KEY
  • SQLITE_OMIT_PRAGMA
  • SQLITE_OMIT_REINDEX
  • SQLITE_OMIT_SUBQUERY
  • SQLITE_OMIT_TEMPDB
  • SQLITE_OMIT_TRIGGER
  • SQLITE_OMIT_VACUUM
  • SQLITE_OMIT_VIEW
  • SQLITE_OMIT_VIRTUALTABLE

要构建自定义合并,请首先将原始单个源文件下载到unix或unix类似的开发平台上。一定要获取原始源文件而不是“预处理源文件”。可以从下载页面或直接从配置管理系统获取完整的原始源文件集。

假设SQLite源码树存储在名为“sqlite”的目录中。计划在名为(例如)“bld”的并行目录中构建合并。首先通过运行SQLite源代码树顶部的配置脚本,或者在源代码树顶部创建一个模板Makefiles的副本来构建一个合适的Makefile。然后手编辑这个Makefile以包含所需的编译时选项。最后运行:

代码语言:javascript
复制
make sqlite3.c

或者在Windows上使用MSVC:

代码语言:javascript
复制
nmake /f Makefile.msc sqlite3.c

“sqlite3.c”make目标将自动构建常规的“ sqlite3.c ”合并源文件,其头文件“ sqlite3.h ”和包含TCL接口的“ tclsqlite3.c ”合并源文件。之后,可以将所需的文件复制到项目目录中并根据上述过程进行编译。

要构建用于Windows的SQLite DLL,首先要获取合适的合并源代码文件sqlite3.c和sqlite3.h。这些可以从SQLite网站下载,也可以从源代码生成,如上所示。

使用工作目录中的源代码文件,可以使用以下命令使用MSVC生成一个DLL:

代码语言:javascript
复制
cl sqlite3.c -link -dll -out:sqlite3.dll

上述命令应该从MSVC本地工具命令提示符运行。如果您的计算机上安装了MSVC,则可能有多个版本的此命令提示符,适用于x86和x64的本机构建,也可能用于交叉编译到ARM。根据所需的DLL使用适当的命令提示符。

如果使用MinGW编译器,命令行是这样的:

代码语言:javascript
复制
gcc -shared sqlite3.c -o sqlite3.dll

请注意,MinGW仅生成32位DLL。有一个单独的MinGW64项目可用于生成64位DLL。据推测,命令行语法是相似的。另请注意,最新版本的MSVC生成的DLL在WinXP和Windows的早期版本上不起作用。因此,为了最大限度地兼容您生成的DLL,建议使用MinGW。一个很好的经验法则是使用MinGW和使用MSVC的64位DLL生成32位DLL。

在大多数情况下,您需要使用适合您应用程序的编译时选项来补充上述基本命令。常用的编译时选项包括:

  • -Os - 优化尺寸。使DLL尽可能小。
  • -O2 - 优化速度。这将通过展开循环和内联函数来扩大DLL。
  • -DSQLITE_ENABLE_FTS4 - 在SQLite中包含全文搜索引擎代码。
  • -DSQLITE_ENABLE_RTREE - 包含R-Tree扩展。
  • -DSQLITE_ENABLE_COLUMN_METADATA - 这启用了一些常用系统所需的额外API,包括Ruby-on-Rails。
代码语言:javascript
复制
 SQLite在公共领域。

扫码关注腾讯云开发者

领取腾讯云代金券