新闻详情

新闻详情

首页 / 资讯中心 / 详情

sqlite-vec 的 C/C++ 使用指南:单文件 Amalgamation 源码的获取、编译与集成

发布时间:2026/10/2 22:21:43来源:尧图网络
sqlite-vec 的 C/C++ 使用指南:单文件 Amalgamation 源码的获取、编译与集成
向量数据库数据库【免费下载链接】sqlite-vecA vector search SQLite extension that runs anywhere!项目地址https://gitcode.com/GitHub_Trending/sq/sqlite-vec点击查看免费下载sqlite-vec 是一个以单一sqlite-vec.c 单一sqlite-vec.h形式分发的向量搜索 SQLite 扩展C/C 项目可以直接把这两个文件 vendoring内嵌进工程当作普通源码一起编译。本文以仓库中的 C 使用文档 为骨架结合仓库根目录的源码、简单 C 示例、Makefile 与 Amalgamation 脚本完整讲解如何获取与生成单文件源码、头文件暴露的初始化 API、静态编译进宿主程序、动态加载为扩展、以及把 vec0 内建进 sqlite3 CLI 的四种主流集成方式。读完本文你将能在自己的 C/C 工程中独立完成 sqlite-vec 的接入并跑通建表、插入向量、KNN 查询的完整链路。一、为什么是单文件Amalgamation 分发方式在仓库根目录可以看到开发态的源码其实由多个文件组成入口sqlite-vec.c其中通过#include sqlite-vec-*.c引入若干子模块若干按功能拆分的实现文件例如sqlite-vec-ivf.c、sqlite-vec-ivf-kmeans.c、sqlite-vec-diskann.c、sqlite-vec-rescore.c头文件模板sqlite-vec.h.tmpl经版本号填充后生成sqlite-vec.h。为了让下游 C/C 用户拿两个文件就能编译项目提供了Amalgamation合并构建把所有这些.c子文件内联进一个sqlite-vec.c。执行make amalgamation会在dist/目录生成合并后的dist/sqlite-vec.c。其背后调用的是 scripts/amalgamate.py核心逻辑包括用正则匹配#include sqlite-vec-*.c并把每个子文件的内容原样内联进主文件同时在内外添加Begin inlined: .../End inlined: ...分隔注释见 amalgamate.py 的 inline_include 函数剥离每个子文件自身的 include guard如SQLITE_VEC_IVF_C避免合并后重复定义剥离用于 LSP 支持的特殊#ifndef SQLITE_VEC_H代码块。这正是 C 使用文档 中所说sqlite-vec项目是一个单一sqlite-vec.c和sqlite-vec.h文件的来历开发态是分文件的发布态是合并后的单文件。官方 Release 页面直接提供 Amalgamation 构建产物用户无需参与合并过程拿产物即可 vendoring。二、头文件与初始化 API先认识sqlite3_vec_init无论采用哪种集成方式最终都要把扩展注册进 SQLite 连接。所有集成的核心入口只有一个函数SQLITE_VEC_API int sqlite3_vec_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi);该原型定义在 sqlite-vec.h.tmpl经版本填充后生成正式sqlite-vec.h。头文件还定义了这些与集成相关的宏SQLITE_VEC_VERSION/SQLITE_VEC_VERSION_MAJOR/SQLITE_VEC_VERSION_MINOR/SQLITE_VEC_VERSION_PATCH编译进产物里的版本号可用来做运行时兼容性判断SQLITE_CORE静态链接场景必须定义。未定义时头文件会#include sqlite3ext.h并配合SQLITE_EXTENSION_INIT1可加载扩展模式由 SQLite 在加载时注入 API 例程定义后则改用普通的#include sqlite3.hSQLITE_VEC_STATIC静态链接时定义使SQLITE_VEC_API变为空否则在 Windows 上会展开为__declspec(dllexport)extern C块包裹见 sqlite-vec.h.tmpl保证 C 项目可以无阻地 include。可以推断sqlite3_vec_init的三个参数与 SQLite 扩展入口约定一致db是目标连接句柄pzErrMsg用于回传错误信息pApi是扩展 API 例程表静态编译时pApi传NULL即可源码中SQLITE_EXTENSION_INIT1宏在两种模式下有不同的展开。三、方式一源码 vendoring 静态编译进 C 程序文档强调这两个文件可以 vendoring 进你的 C 或 C 项目像普通源码一样编译。仓库里的 examples/simple-c/Makefile 给出了最直接的编译命令demo: demo.c gcc \ -O3 -DSQLITE_CORE \ -I../../ -I../../vendor \ demo.c ../../sqlite-vec.c ../../vendor/sqlite3.c \ -o $要点拆解-DSQLITE_CORE让sqlite-vec.c/sqlite-vec.h走静态编译路径见上文头文件说明且在此模式下sqlite3_vec_init通过sqlite3_auto_extension()注册为自动扩展每个新打开的数据库连接都会自动加载 vec0无需手动.load../../sqlite-vec.c ../../vendor/sqlite3.c把扩展源码和 SQLite 内核源码一起编译最终链接出不依赖任何外部 .so/.dylib 的独立可执行文件-I../../vendor提供sqlite3.h、sqlite3ext.h等头文件所在目录Linux 下若在 Makefile 顶层构建还会追加-lm顶层 Makefile 中CFLAGS -lm。对 C 项目同理只要sqlite-vec.h的extern C块在 include 时生效把sqlite-vec.c作为编译单元加入工程即可。四、一个完整的 C 示例建表、批量插入、KNN 查询examples/simple-c/demo.c 是一个可以原样编译运行的完整示例完整展示了静态集成的全流程。我们分段解读其核心链路。第一步注册自动扩展并打开数据库rc sqlite3_auto_extension((void (*)())sqlite3_vec_init); assert(rc SQLITE_OK); rc sqlite3_open(:memory:, db); assert(rc SQLITE_OK);sqlite3_auto_extension()把sqlite3_vec_init登记为全局自动扩展此后每个新建连接都内置 vec0。随后用sqlite3_prepare_v2执行SELECT sqlite_version(), vec_version()验证扩展是否生效——能查出vec_version()说明加载成功。第二步创建 vec0 虚拟表CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])vec0 是 sqlite-vec 提供的向量索引虚拟表float[4]声明向量维度为 4数据类型为 32 位浮点。第三步在事务中批量插入向量sqlite3_exec(db, BEGIN, NULL, NULL, NULL); sqlite3_prepare_v2(db, INSERT INTO vec_items(rowid, embedding) VALUES (?, ?), ...); for (...) { sqlite3_bind_int64(stmt, 1, items[i].id); sqlite3_bind_blob(stmt, 2, items[i].vector, sizeof(items[i].vector), SQLITE_STATIC); ... } sqlite3_exec(db, COMMIT, NULL, NULL, NULL);这里有几个值得注意的细节rowid作为主键绑定为 64 位整数向量以 BLOB 形式绑定sqlite3_bind_blob直接把float数组的内存原样写入SQLITE_STATIC表示数据生命周期由调用方保证用BEGIN/COMMIT包裹插入循环批量写入效率更高每轮sqlite3_step返回SQLITE_DONE后调用sqlite3_reset(stmt)复用同一语句对象。第四步KNN 查询SELECT rowid, distance FROM vec_items WHERE embedding MATCH ?1 ORDER BY distance LIMIT 3查询向量同样以 4 字节 × 维度数的 BLOB 绑定到?1示例数据为{0.3, 0.3, 0.3, 0.3}。MATCH运算符触发最近邻搜索distance是 SQLite 为该查询暴露的虚拟列ORDER BY distance LIMIT 3取最近的前 3 条。循环sqlite3_step直至SQLITE_DONE逐行读取rowidsqlite3_column_int64与distancesqlite3_column_double并打印即完成一次完整的最近邻检索。在示例数据5 个0.1~0.5的等比例向量下预期输出为rowid3 distance0完全命中以及距离逐渐增大的rowid2、rowid4。五、方式二直接调用初始化函数免 auto_extensionsqlite3_auto_extension是一次注册、全局生效适合宿主程序要反复开关连接如每个请求一个连接的场景。如果你的程序只有一个长生命周期连接也可以手动调用初始化函数。仓库的 tests/minimum/demo.c 展示了这种更精简的写法rc sqlite3_open(:memory:, db); rc sqlite3_vec_init(db, NULL, NULL); assert(rc SQLITE_OK);注意此处sqlite3_vec_init的第三个参数传NULL——因为编译时定义了SQLITE_CORE扩展处于静态模式不需要 SQLite 运行时注入 API 例程表详见 tests/minimum/Makefile其中同样携带-DSQLITE_CORE。两种初始化的取舍可以这样概括初始化方式典型代码适用场景sqlite3_auto_extension(sqlite3_vec_init)程序启动时调用一次多连接 / 频繁开关连接所有连接自动获得 vec0sqlite3_vec_init(db, NULL, NULL)每个连接手动调用单连接或需要精细控制加载时机的场景六、方式三静态编译进 sqlite3 CLImake cli想把 vec0 内建进自己的 sqlite3 命令行工具方便.load_extension之外的批处理与基准测试仓库根 Makefile 的cli目标演示了完整做法关键机制是 SQLite 的SQLITE_EXTRA_INIT编译选项它允许在 CLI 初始化阶段注入一段代码。examples/sqlite3-cli/core_init.c 就是被注入的入口#include sqlite3.h #include sqlite-vec.h int core_init(const char *dummy) { return sqlite3_auto_extension((void *)sqlite3_vec_init); }然后编译时带上-DSQLITE_EXTRA_INITcore_init把core_init.c一并链接$(CC) -O2 -g \ -DSQLITE_CORE \ -DSQLITE_EXTRA_INITcore_init \ -DSQLITE_THREADSAFE0 \ -Ivendor/ -I./ \ $(CFLAGS) \ vendor/sqlite3.c vendor/shell.c sqlite-vec.c examples/sqlite3-cli/core_init.c \ -ldl -lm -o $(prefix)/sqlite3执行make cli后即可得到自带 vec0 的dist/sqlite3例如dist/sqlite3 :memory: SELECT vec_version()不需要.load_extension就能直接使用 vec0 语法。注释还指出这种带调试符号的自编译 CLI 常用于基准测试、性能剖析和无脚本化加载的批处理场景Makefile。七、方式四编译为可加载扩展loadable extension若宿主 SQLite 版本不便重编译或希望按需加载则使用可加载扩展方式。顶层 Makefile 的loadable目标$(TARGET_LOADABLE): sqlite-vec.c sqlite-vec.h $(prefix) $(CC) \ -fPIC -shared \ -Wall -Wextra \ -Ivendor/ \ -O3 \ $(CFLAGS) \ $ -o $产物扩展名随平台变化见 MakefileLinux 为dist/vec0.somacOS 为dist/vec0.dylibWindows 为dist/vec0.dll。使用方式即标准 SQLite 加载.load ./vec0注意此模式下不要定义SQLITE_COREsqlite3ext.h与SQLITE_EXTENSION_INIT1会让扩展以标准 SQLite 扩展 API 方式初始化pApi由加载器传入。这也解释了头文件为什么用#ifndef SQLITE_CORE区分两种 include 路径。八、C 项目接入与常见编译问题C 接入头文件已用extern C包裹全部声明sqlite-vec.h.tmplC 源文件直接#include sqlite-vec.h即可链接时把sqlite-vec.c作为 C 编译单元加入即可。若需在 Windows 上以静态库形式链接记得同时定义SQLITE_CORE与SQLITE_VEC_STATIC对应顶层 Makefile 的static目标ar rcs打出libsqlite_vec0.a。常见编译问题速查症状原因与对策sqlite3ext.h: No such file or directory未定义SQLITE_CORE却想静态编译静态场景必须加-DSQLITE_CORE链接报sqlite3_vec_init未定义漏把sqlite-vec.c加入编译/链接单元Windows 上出现 dllexport 相关符号冲突静态链接时补-DSQLITE_VEC_STATICLinux 链接失败、缺数学符号追加-lm顶层 Makefile 已默认处理加载 .so 时not an authorized extension宿主 SQLite 启用了安全加载策略需用sqlite3_enable_load_extension()或在允许列表中加入该扩展九、小结围绕 C 使用文档 的核心主张——单一sqlite-vec.csqlite-vec.hvendoring 后像普通源码一样编译——本文梳理了四条可落地的集成路径静态编译进自有程序-DSQLITE_COREsqlite3_auto_extension或直接调用sqlite3_vec_init参考 examples/simple-c/demo.c内建进 sqlite3 CLISQLITE_EXTRA_INITcore_init注入自动扩展参考 examples/sqlite3-cli/core_init.c编译为可加载扩展make loadable产出vec0.so/.dylib/.dllSELECT load_extension按需加载合并源码自取make amalgamation借助 scripts/amalgamate.py 生成单文件产物便于离线 vendoring 与定制构建。无论走哪条路核心都是理解sqlite3_vec_init这一个入口函数以及SQLITE_CORE/SQLITE_VEC_STATIC两个宏对编译模式的切换。结合 vec0 虚拟表文档 与 KNN 特性文档 继续深入即可在 C/C 项目中完整落地向量检索能力。赞分享向量数据库数据库【免费下载链接】sqlite-vecA vector search SQLite extension that runs anywhere!项目地址https://gitcode.com/GitHub_Trending/sq/sqlite-vec点击查看免费下载相关推荐MXNet Amalgamation 单文件编译指南基于 C Predict API 的跨平台推理部署MXNet Amalgamation 单文件编译指南基于 C Predict API 的跨平台推理部署 MXNet Amalgamation 是仓库中一套把整深度学习机器学习人工智能C语言集成sqlite-vec构建高效向量搜索应用的完整指南C语言集成sqlite vec构建高效向量搜索应用的完整指南 sqlite vec是一个轻量级的向量搜索SQLite扩展专为C语言开发者设计提供高效的向量向量数据库数据库OptiScaler 超分辨率画质增强快速上手免费解锁任意显卡的 DLSS/FSR/XeSS 互切OptiScaler 超分辨率画质增强快速上手免费解锁任意显卡的 DLSS/FSR/XeSS 互切 OptiScaler 是一款免费开源的超分辨率画质增强中间图形学游戏开发上一篇Doublecheck Agent面向 GitHub Copilot 的 AI 输出三层核验智能体实战指南下一篇Hyperledger Fabric 链码生命周期实战使用 peer lifecycle 命令将智能合约部署到通道创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Mac剪贴板预测工具Paste:用上下文智能替代历史列表 2026/10/2 23:04:15

Mac剪贴板预测工具Paste:用上下文智能替代历史列表

1. 项目概述:Paste 是什么?它解决的是 Mac 用户每天都在经历却从未被正视的“剪贴板疲劳”Paste 这个名字乍看平平无奇,但当你把它和 “Show HN” 这个 Hacker News 的标志性前缀放在一起,再结合它在 Mac 平台上的具体行为——“s…

阅读更多 →
AI agent生产级地基:四层架构与并发实战 2026/10/2 23:04:15

AI agent生产级地基:四层架构与并发实战

1. 从9月22日热榜说起:三个项目为什么都在给AI agent造地基9月22日的GitHub热榜有个很明显的信号:前五名里有三个项目,方向都指向同一件事——给AI agent搭底层设施。不是做应用层,不是做UI,而是做“地基”。这个现象值…

阅读更多 →
AI Agent地基:四层基建拆解与从0到1落地路径 2026/10/2 23:04:14

AI Agent地基:四层基建拆解与从0到1落地路径

9.22 那期的 GitHub 热榜,我翻了好几遍,越看越觉得这期特别有代表性。前五名里三个项目,本质上都在做同一件事:给 AI agent 造地基。放在一年前,热榜前排通常被"当天就能跑出惊艳 demo"的应用型项目占领&…

阅读更多 →
DIY开放式硬件测试平台OpenRig:模块化铝型材机架全解析 2026/10/2 23:03:42

DIY开放式硬件测试平台OpenRig:模块化铝型材机架全解析

1. 为什么我把手头的机箱换成开放式裸测平台1.1 被机箱耽误的三个真实瞬间做硬件相关的工作,完全绕不开“机箱空间不够”这件事。去年年中,我接了一个深度学习工作站的升级任务,原本配置没问题,但要把显卡从旧卡换成40系列的越肩大…

阅读更多 →
VMware与Credential Guard冲突原理及彻底解决指南 2026/10/2 23:03:41

VMware与Credential Guard冲突原理及彻底解决指南

1. 问题本质与真实影响范围:这不是VMware的bug,而是Windows安全机制的主动拦截 “VMware Workstation 与 Device/Credential Guard 不兼容”——这行报错文字,过去三年里几乎成了Windows 10/11专业版用户安装VMware时的“默认开场白”。它不像…

阅读更多 →
C++红黑树从原理到实现:平衡二叉树为何默认是它? 2026/10/2 23:03:31

C++红黑树从原理到实现:平衡二叉树为何默认是它?

在C里提到平衡二叉树,十有八九指的并不是AVL树,而是红黑树。不管你是用std::map、std::set还是std::multiset,底层容器都是同一棵红黑树。我最早真正读红黑树源码,是翻开源STL的rb_tree,第一感觉就是:这堆旋…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉