将 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_startsize_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 将资源(例如,着色器代码;图像)嵌入到可执行文件/库中

将 sqlite DB 添加到可执行 JAR 文件

是否可以将 Electron 应用程序和数据文件嵌入到单个可执行文件中?

如何生成嵌入所有文件的 C++ 安装程序? [关闭]