【问题标题】:Embed sqlite database into c++ executable将 sqlite 数据库嵌入到 c++ 可执行文件中
【发布时间】:2021-09-29 20:58:02
【问题描述】:

我认为我的问题与this 相关,但那是在谈论 png,我不知道如何将其转化为我的情况。

我在以 .db 结尾的文件中使用 sqlite 创建了一个数据库。现在我有一个只从这个数据库中读取的程序。有没有办法将数据库文件包含到可执行文件中?

现在,如果我编译,我必须将可执行文件和文件放在一起。可以通过将数据库文件放在绝对路径中来删除这种依赖关系,但我也在处理 hpc 集群,所以这不起作用。我需要一个相对路径,以便 db 文件与我的 main.cpp 处于同一层次结构,但我希望能够在不处理 db 文件的情况下复制可执行文件,因此在某种程度上,db 文件已经是可执行文件的一部分。

【问题讨论】:

    标签: c++ sqlite c++11 gcc


    【解决方案1】:

    假设您在二进制文件中嵌入了 SQLite 数据库,您有一个 const char *embedded_startsize_t embedded_length 表示数据库的开始和长度。

    答案取决于你愿意付出多少努力:

    1. 最简单的方法是创建一个临时文件,转储其中的 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);
    
    1. 如果您不希望文件在磁盘上逗留,请使用 memfd_create 创建一个文件描述符,将字节加载到其中,然后让 SQLite 打开/proc/self/fd/X
    2. 实现一个自定义 VFS,它在内存中执行所有操作。 This link 可能是一个开始。

    【讨论】:

    • 我想采用最简单的方法。您能否提供第一个选项的链接或代码示例?
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2014-05-24
    • 2011-11-09
    相关资源
    最近更新 更多