Gle*_*son 5 linux sqlite compilation
我想将扩展编译为 sqlite 以便在运行时加载。
我使用的文件是扩展名 - 来自https://www.sqlite.org/contrib 的functions.c
我已经能够编译成一个可加载模块,但我需要静态链接它以在运行时加载(用于在运行时shell.c创建接口)
我已经阅读了有关链接的手册,但说实话,这有点超出了我的理解范围!
有人可以让我知道我需要做什么来编译吗?
我找到了一种从源代码编译 sqlite3 的方法,其中包含extension_functions.c.
\n\n笔记:
\n这次我展示了一种相当肮脏和简单的方法来编译具有附加功能的 sqlite,因为我没有成功地以正确的方式做到这一点。
\n但请记住,正如 @ngreen 上面所说,准备一个全新的合并部分来添加自定义功能可能会更好。
\n
\n这就是sqlite本身的设计方式。
https://www.sqlite.org/download.html
\n选择合并之一,最好使用autoconf版本。
\n例如,这里是3.33.0版本的下载链接。
https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz
\ncurl -O https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz\ntar -xzvf sqlite-autoconf-3330000.tar.gz\ncd sqlite-autoconf-3330000\nRun Code Online (Sandbox Code Playgroud)\nextension_functions.c在此网址列出。
\n\n实际网址:
\nhttps://sqlite.org/contrib/download/extension-functions.c?get=25
\ncurl -o extension_functions.c https://sqlite.org/contrib/download/extension-functions.c?get=25\nRun Code Online (Sandbox Code Playgroud)\n我们可以指定--prefix选项来确定构建内容的目的地。
./configure --prefix=/usr/local/sqlite/3.33.0\nRun Code Online (Sandbox Code Playgroud)\n此时可以将其他配置时间选项指定为环境变量。
\n查看https://www.sqlite.org/draft/compile.html了解更多详细信息。
以下是启用 JSON 和 RTree 索引功能的示例。
\nCPPFLAGS="-DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_RTREE=1" ./configure --prefix=/usr/local/sqlite/3.33.0\nRun Code Online (Sandbox Code Playgroud)\n还可以指定 autoconf 选项。
\nCPPFLAGS="-DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_RTREE=1" ./configure --prefix=/usr/local/sqlite/3.33.0 --enable-dynamic-extensions\nRun Code Online (Sandbox Code Playgroud)\n我在官方网站上找不到有关这些选项的任何文档,但在配置脚本本身中找到了一些内容。
\nOptional 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]\nRun Code Online (Sandbox Code Playgroud)\n仅供参考,这是 Homebrew 中使用的默认安装脚本。也许确定应指定哪个选项会很有用。
\nOptional 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]\nRun Code Online (Sandbox Code Playgroud)\n现在我们必须修改extension_functions.c以避免与sqlite源代码冲突,然后再将它们一起编译。
打开extension_functions.c123~128 行并将其替换为单行SQLITE_EXTENSION_INIT1。
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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n我们需要插入一些行来shell.c导入并启用扩展功能。
打开shell.c,搜索static void open_db并插入#include "extension_functions.c"到上面的行。
SQLITE_EXTENSION_INIT1\nRun Code Online (Sandbox Code Playgroud)\n然后搜索sqlite3_shathree_init(p->db, 0, 0);并插入sqlite3_extension_init(p->db, 0, 0);到 init func 的底部。
#include "extension_functions.c"\n\nstatic void open_db(ShellState *p, int openFlags){\nRun Code Online (Sandbox Code Playgroud)\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);\nRun Code Online (Sandbox Code Playgroud)\n这需要一段时间,完成后,将在配置时通过选项指定的目的地生成分发文件--prefix。
make install\nRun Code Online (Sandbox Code Playgroud)\n
我不确定这是否是一个完整的答案,但从如何编译文档来看,您可能想首先进行合并。您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你所说的文件,但过程应该是类似的。