如何将扩展编译成sqlite?

2023-12-29

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

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

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

我看过关于链接的手册,但说实话,有点超出我的理解范围!

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


我找到了一种从源代码编译 sqlite3 的方法,并提供了附加功能extension_functions.c.

Note:

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

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

1.下载sqlite源码

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

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

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

curl -O https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz
tar -xzvf sqlite-autoconf-3330000.tar.gz
cd sqlite-autoconf-3330000

2. 下载extension_functions.c

在此网址列出。

https://sqlite.org/contrib https://sqlite.org/contrib

实际网址:

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

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

3.配置编译

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

./configure --prefix=/usr/local/sqlite/3.33.0

此时可以将其他配置时间选项指定为环境变量。
Check https://www.sqlite.org/draft/compile.html https://www.sqlite.org/draft/compile.html更多细节。

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

CPPFLAGS="-DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_RTREE=1" ./configure --prefix=/usr/local/sqlite/3.33.0

还可以指定 autoconf 选项。

CPPFLAGS="-DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_RTREE=1" ./configure --prefix=/usr/local/sqlite/3.33.0 --enable-dynamic-extensions

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

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

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

def install
  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_COLUMN_METADATA=1"
  # Default value of MAX_VARIABLE_NUMBER is 999 which is too low for many
  # applications. Set to 250000 (Same value used in Debian and Ubuntu).
  ENV.append "CPPFLAGS", "-DSQLITE_MAX_VARIABLE_NUMBER=250000"
  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_RTREE=1"
  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1"
  ENV.append "CPPFLAGS", "-DSQLITE_ENABLE_JSON1=1"

  args = %W[
    --prefix=#{prefix}
    --disable-dependency-tracking
    --enable-dynamic-extensions
    --enable-readline
    --disable-editline
    --enable-session
  ]

  system "./configure", *args
  system "make", "install"
end

4.消除冲突

现在我们必须修改extension_functions.c以避免在将它们编译在一起之前与 sqlite 的源代码发生冲突。

Open extension_functions.c并将第 123 ~ 128 行替换为单行SQLITE_EXTENSION_INIT1.

#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#else
#include "sqlite3.h"
#endif

SQLITE_EXTENSION_INIT1

5. 启用扩展功能

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

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

#include "extension_functions.c"

static void open_db(ShellState *p, int openFlags){

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

#endif
    sqlite3_fileio_init(p->db, 0, 0);
    sqlite3_shathree_init(p->db, 0, 0);
    sqlite3_completion_init(p->db, 0, 0);
    sqlite3_uint_init(p->db, 0, 0);
    sqlite3_decimal_init(p->db, 0, 0);
    sqlite3_ieee_init(p->db, 0, 0);
    sqlite3_extension_init(p->db, 0, 0);

6. 编译

最后准备编译包含扩展函数的 sqlite。

make install

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

# Now we can use extension_functions without loading it manually.
$ /usr/local/sqlite/3.33.0/bin/sqlite3
sqlite> select cos(10);
-0.839071529076452
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将扩展编译成sqlite? 的相关文章

随机推荐

  • 返回键是否破坏了活动?

    我有一个活动定义如下
  • MathML 到 LaTeX 的转换

    我试图弄清楚如何转换数学方程的 MathML 表示形式 并将其转换为该数学方程的 LaTeX 表示形式 那么例如
  • 页面重新加载时 getInitialProps 不起作用

    我在 app js 组件中使用 getInitialProps 但是当我重新加载页面时 请求不会执行 例如 getData js import as axios from axios export default async functio
  • Outlook VBA 将富文本转换为 HTML 格式

    我的交换服务器空间有限 因此我想将 Outlook 2007 收件箱中所有选定的邮件转换为 HTML 格式 因为当涉及图像时 它们比富文本格式的等效内容小 我有下面的代码可以完成这项工作 但是格式到处都是 图像变成不可读的附件 并且大小没有
  • 链接问题:致命错误 LNK1112:模块机器类型“x64”与目标机器类型“X86”冲突

    我正在尝试从 wxFreeChart 库运行示例应用程序 编译链接后出现错误 wxcode msw28d freechart lib wxfreechart lib xydataset obj fatal error LNK1112 mod
  • vb6 数组,上限为 -1

    一些功能例如Split 如果数组没有项 将返回一个数组 其中 1 为上限 0 为下限 例如 Dim s As String s Split Debug Print UBound s Debug Pring LBound s 在这种情况下 U
  • 如何获取包含字符串的列表的索引

    我有一个List
  • 在运行时加载程序集

    我的项目是一个应用程序 我们在其中加载各种程序集并对它们执行操作 我们陷入了这样一种情况 我们需要添加对我们加载的程序集的引用 将由用户选择 所以我需要在运行时添加对DLL的引用 I tried 这个网站 http www codeproj
  • android updateLocaleListFromAppContext NullPointerException 中的问题

    最近我的应用程序崩溃并显示以下错误 我无法检测到实际问题是什么 也无法检测到崩溃 如果有人对此崩溃有解决方案 请帮助解决此问题 java lang NullPointerException at android app ActivityTh
  • 编写一个例程来创建顺序记录

    我想编写一个例程 它允许我在跨越设定时间范围的表中获取带日期的事件 记录 并且在特定日期没有发生事件的情况下 将创建一个重复最多的事件最近确实发生过事件的记录 例如 如果在 9 月 4 日 字段 1 X 字段 2 Y 和字段 3 Z 然后直
  • 如何删除通过 jQuery 插入的引导模式?

    我决定拥有一个可以在需要插入自定义 Bootstrap 模式时使用的脚本 我不想让空的静态 Bootstrap 模式 HTML 位于每个页面的底部 如果它不总是被利用的话 所以 这可能是错误的做法 但这是我的尝试 我创建了一个变量 它是模式
  • 从 Java 连接到 OLEDB 数据源?

    我们正在尝试连接到 ACT CRM 系统使用的 SQL Server 实例 他们设法锁定了一切 因此无法使用 ODBC 连接到 SQL 后端 有一些特殊的实用程序可以添加 ODBC 支持 如果您购买了该软件的 primo 版本 则可以安装它
  • 在 Android 应用程序中嵌入广告?

    我想制作一个我拥有的 Android 应用程序的免费版本 但想在其中嵌入广告 我不知道应该从哪里开始 有没有一家专门从事移动广告的知名移动广告公司 我个人都用过Admob http www admob com and Adsense htt
  • 如何在 opencv 2.4.11 python 中调整轮廓大小? (目标:对象提取)

    我对 opencv 非常陌生 所以请原谅我的无知 基本上 我的图像中有一个感兴趣的对象 我想把它提取出来 我的问题是由于缩小原始图像的尺寸以方便处理而产生的 我在较小的图像上找到了物体的轮廓 我真正想做的是使用有关该轮廓的信息从原始全尺寸图
  • 具有声明的宽度和高度的图像在加载前呈现正方形

    我有声明宽度和高度的图像 例如 img src foo jpg width 1500 height 1800 alt bar 它们位于响应式网格内 因此它们显示在max width 100 它们是延迟加载的 问题是 尽管有height au
  • 对于表示返回 void 的操作的任务,Task.FromResult() 的替代方案是什么[重复]

    这个问题在这里已经有答案了 返回没有泛型类型参数的任务的最佳方法是什么 换句话说 任务代表不返回任何内容或返回任何内容的操作void 换句话说 我正在寻找以下替代方案 T value default T return Task FromRe
  • 如何在切换 Bootstrap 3 面板时为 V 形字形图标设置动画?

    我有一个用 Bootstrap 3 手风琴包裹的面板的工作解决方案 如何通过 90 度旋转将 V 形状态从 gt 更改为 panel heading accordion toggle after font family Glyphicons
  • Django:is_valid 和 form_valid 之间的区别

    我创建了一个表单 它是forms ModelForm 在 视图 方面 我创建了一个视图 它是generic UpdateView 在这两个不同的班级中 我有is valid 一侧 并且form valid 另一方面 class Profil
  • W3Schools 试用编辑器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道如何获得 或在哪里获得 或如何制作 或在哪里可以找到关于w3schools 尝试一下编辑器 h
  • 如何将扩展编译成sqlite?

    我想将扩展编译到 sqlite 中以便在运行时加载 我使用的文件扩展名为 functions c 来自https www sqlite org contrib https www sqlite org contrib 我已经能够编译成可加载