如何将扩展编译为sqlite?

Gle*_*son 5 linux sqlite compilation

我想将扩展编译为 sqlite 以便在运行时加载。

我使用的文件是扩展名 - 来自https://www.sqlite.org/contrib 的functions.c

我已经能够编译成一个可加载模块,但我需要静态链接它以在运行时加载(用于在运行时shell.c创建接口)

我已经阅读了有关链接的手册,但说实话,这有点超出了我的理解范围!

有人可以让我知道我需要做什么来编译吗?

Yuh*_*sak 8

我找到了一种从源代码编译 sqlite3 的方法,其中包含extension_functions.c.

\n
\n

笔记:

\n

这次我展示了一种相当肮脏和简单的方法来编译具有附加功能的 sqlite,因为我没有成功地以正确的方式做到这一点。

\n

但请记住,正如 @ngreen 上面所说,准备一个全新的合并部分来添加自定义功能可能会更好。
\n这就是sqlite本身的设计方式。

\n
\n

1.下载sqlite源码

\n

https://www.sqlite.org/download.html

\n

选择合并之一,最好使用autoconf版本。
\n例如,这里是3.33.0版本的下载链接。

\n

https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz

\n
curl -O https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz\ntar -xzvf sqlite-autoconf-3330000.tar.gz\ncd sqlite-autoconf-3330000\n
Run Code Online (Sandbox Code Playgroud)\n

2. 下载extension_functions.c

\n

在此网址列出。

\n

https://sqlite.org/contrib

\n

实际网址:

\n

https://sqlite.org/contrib/download/extension-functions.c?get=25

\n
curl -o extension_functions.c https://sqlite.org/contrib/download/extension-functions.c?get=25\n
Run Code Online (Sandbox Code Playgroud)\n

3.配置编译

\n

我们可以指定--prefix选项来确定构建内容的目的地。

\n
./configure --prefix=/usr/local/sqlite/3.33.0\n
Run Code Online (Sandbox Code Playgroud)\n

此时可以将其他配置时间选项指定为环境变量。
\n查看https://www.sqlite.org/draft/compile.html了解更多详细信息。

\n

以下是启用 JSON 和 RTree 索引功能的示例。

\n
CPPFLAGS="-DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_RTREE=1" ./configure --prefix=/usr/local/sqlite/3.33.0\n
Run Code Online (Sandbox Code Playgroud)\n

还可以指定 autoconf 选项。

\n
CPPFLAGS="-DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_RTREE=1" ./configure --prefix=/usr/local/sqlite/3.33.0 --enable-dynamic-extensions\n
Run Code Online (Sandbox Code Playgroud)\n

我在官方网站上找不到有关这些选项的任何文档,但在配置脚本本身中找到了一些内容。

\n
Optional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-silent-rules   less verbose build output (undo: "make V=1")\n  --disable-silent-rules  verbose build output (undo: "make V=0")\n  --disable-largefile     omit support for large files\n  --enable-dependency-tracking\n                          do not reject slow dependency extractors\n  --disable-dependency-tracking\n                          speeds up one-time build\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\n  --enable-static[=PKGS]  build static libraries [default=yes]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n  --enable-editline       use BSD libedit\n  --enable-readline       use readline\n  --enable-threadsafe     build a thread-safe library [default=yes]\n  --enable-dynamic-extensions\n                          support loadable extensions [default=yes]\n  --enable-fts4           include fts4 support [default=yes]\n  --enable-fts3           include fts3 support [default=no]\n  --enable-fts5           include fts5 support [default=yes]\n  --enable-json1          include json1 support [default=yes]\n  --enable-rtree          include rtree support [default=yes]\n  --enable-session        enable the session extension [default=no]\n  --enable-debug          build with debugging features enabled [default=no]\n  --enable-static-shell   statically link libsqlite3 into shell tool\n                          [default=yes]\n
Run Code Online (Sandbox Code Playgroud)\n

仅供参考,这是 Homebrew 中使用的默认安装脚本。也许确定应指定哪个选项会很有用。

\n
Optional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-silent-rules   less verbose build output (undo: "make V=1")\n  --disable-silent-rules  verbose build output (undo: "make V=0")\n  --disable-largefile     omit support for large files\n  --enable-dependency-tracking\n                          do not reject slow dependency extractors\n  --disable-dependency-tracking\n                          speeds up one-time build\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\n  --enable-static[=PKGS]  build static libraries [default=yes]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n  --enable-editline       use BSD libedit\n  --enable-readline       use readline\n  --enable-threadsafe     build a thread-safe library [default=yes]\n  --enable-dynamic-extensions\n                          support loadable extensions [default=yes]\n  --enable-fts4           include fts4 support [default=yes]\n  --enable-fts3           include fts3 support [default=no]\n  --enable-fts5           include fts5 support [default=yes]\n  --enable-json1          include json1 support [default=yes]\n  --enable-rtree          include rtree support [default=yes]\n  --enable-session        enable the session extension [default=no]\n  --enable-debug          build with debugging features enabled [default=no]\n  --enable-static-shell   statically link libsqlite3 into shell tool\n                          [default=yes]\n
Run Code Online (Sandbox Code Playgroud)\n

4.消除冲突

\n

现在我们必须修改extension_functions.c以避免与sqlite源代码冲突,然后再将它们一起编译。

\n

打开extension_functions.c123~128 行并将其替换为单行SQLITE_EXTENSION_INIT1

\n
def install\n  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_COLUMN_METADATA=1"\n  # Default value of MAX_VARIABLE_NUMBER is 999 which is too low for many\n  # applications. Set to 250000 (Same value used in Debian and Ubuntu).\n  ENV.append "CPPFLAGS", "-DSQLITE_MAX_VARIABLE_NUMBER=250000"\n  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_RTREE=1"\n  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1"\n  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_JSON1=1"\n\n  args = %W[\n    --prefix=#{prefix}\n    --disable-dependency-tracking\n    --enable-dynamic-extensions\n    --enable-readline\n    --disable-editline\n    --enable-session\n  ]\n\n  system "./configure", *args\n  system "make", "install"\nend\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x86\x93

\n
#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE\n#include "sqlite3ext.h"\nSQLITE_EXTENSION_INIT1\n#else\n#include "sqlite3.h"\n#endif\n
Run Code Online (Sandbox Code Playgroud)\n

5. 启用扩展功能

\n

我们需要插入一些行来shell.c导入并启用扩展功能。

\n

打开shell.c,搜索static void open_db并插入#include "extension_functions.c"到上面的行。

\n
SQLITE_EXTENSION_INIT1\n
Run Code Online (Sandbox Code Playgroud)\n

然后搜索sqlite3_shathree_init(p->db, 0, 0);并插入sqlite3_extension_init(p->db, 0, 0);到 init func 的底部。

\n
#include "extension_functions.c"\n\nstatic void open_db(ShellState *p, int openFlags){\n
Run Code Online (Sandbox Code Playgroud)\n

6. 编译

\n

最后就可以编译包含扩展函数的 sqlite 了。

\n
#endif\n    sqlite3_fileio_init(p->db, 0, 0);\n    sqlite3_shathree_init(p->db, 0, 0);\n    sqlite3_completion_init(p->db, 0, 0);\n    sqlite3_uint_init(p->db, 0, 0);\n    sqlite3_decimal_init(p->db, 0, 0);\n    sqlite3_ieee_init(p->db, 0, 0);\n    sqlite3_extension_init(p->db, 0, 0);\n
Run Code Online (Sandbox Code Playgroud)\n

这需要一段时间,完成后,将在配置时通过选项指定的目的地生成分发文件--prefix

\n
make install\n
Run Code Online (Sandbox Code Playgroud)\n


ngr*_*een 0

我不确定这是否是一个完整的答案,但从如何编译文档来看,您可能想首先进行合并。您src/shell.c.in可以搜索ext/misc,您会看到类似这样的行:

INCLUDE ../ext/misc/completion.c

脚本使用这些行来tool/mkshellc.tcl构建组合源文件,该文件最终将被编译到命令行 shell 中。一旦 make 过程sqlite3.c完成,您应该在组合源文件中看到您想要的代码。

然后,我找到了一个包含以下代码的函数:

sqlite3_shathree_init(p->db, 0, 0);

我所要做的就是将其添加到同一个地方:

sqlite3_series_init(p->db, 0, 0);

现在我可以使用该generate_series功能了。我找不到functions.c你所说的文件,但过程应该是类似的。