将 sqlite 数据库嵌入到 c++ 可执行文件中
Posted
技术标签:
【中文标题】将 sqlite 数据库嵌入到 c++ 可执行文件中【英文标题】:Embed sqlite database into c++ executable 【发布时间】:2021-09-29 20:58:02 【问题描述】:我认为我的问题与this 相关,但那是在谈论 png,我不知道如何将其转化为我的情况。
我在以 .db 结尾的文件中使用 sqlite 创建了一个数据库。现在我有一个只从这个数据库中读取的程序。有没有办法将数据库文件包含到可执行文件中?
现在,如果我编译,我必须将可执行文件和文件放在一起。可以通过将数据库文件放在绝对路径中来删除这种依赖关系,但我也在处理 hpc 集群,所以这不起作用。我需要一个相对路径,以便 db 文件与我的 main.cpp 处于同一层次结构,但我希望能够在不处理 db 文件的情况下复制可执行文件,因此在某种程度上,db 文件已经是可执行文件的一部分。
【问题讨论】:
【参考方案1】:假设您在二进制文件中嵌入了 SQLite 数据库,您有一个 const char *embedded_start
和 size_t embedded_length
表示数据库的开始和长度。
答案取决于你愿意付出多少努力:
-
最简单的方法是创建一个临时文件,转储其中的 sqlite 字节,然后将其视为任何其他 SQLite 数据库。
FILE *db = tmpfile();
fwrite(embedded_start, embedded_length, 1, db);
fflush(db);
std::string path = std::string"/proc/self/fd/" + std::to_string(fileno(db));
sqlite3_open_v2(path.c_str(), &dbconn, SQLITE_OPEN_READONLY, nullptr);
-
如果您不希望文件在磁盘上逗留,请使用 memfd_create 创建一个文件描述符,将字节加载到其中,然后让 SQLite 打开
/proc/self/fd/X
。
实现一个自定义 VFS,它在内存中执行所有操作。 This link 可能是一个开始。
【讨论】:
我想采用最简单的方法。您能否提供第一个选项的链接或代码示例?以上是关于将 sqlite 数据库嵌入到 c++ 可执行文件中的主要内容,如果未能解决你的问题,请参考以下文章
C++ 使用 SQLite3 ,打开指定数据库,执行插入操作后会啥会写到磁盘?不是对内存进行操作吗?
使用 CMake 将资源(例如,着色器代码;图像)嵌入到可执行文件/库中