C++ 如何在Qt项目中打包大数据?

C++ 如何在Qt项目中打包大数据?,c++,qt,deployment,assets,packaging,C++,Qt,Deployment,Assets,Packaging,我正在做一个Qt项目,其中包括一个大数据集(70Mb+) 数据将由使用数据路径访问它们的库使用 我知道我可以正常使用资源,但因为它们是内存中的对象,所以我不能将它们与库一起使用 因此,我的问题是,如何打包文件或文件夹,使其在安装/运行时可供任何人访问?资源在进程内存中可用,因此进程中使用的任何库都可以访问它们。只需使用QResource类找出资源的地址和大小,并将其传递给库 如果库不能获取指向数据的指针和大小,但坚持使用文件,则可以使用QResource、QTemporaryFile和QFile

我正在做一个Qt项目,其中包括一个大数据集(70Mb+)

数据将由使用数据路径访问它们的库使用

我知道我可以正常使用资源,但因为它们是内存中的对象,所以我不能将它们与库一起使用


因此,我的问题是,如何打包文件或文件夹,使其在安装/运行时可供任何人访问?

资源在进程内存中可用,因此进程中使用的任何库都可以访问它们。只需使用
QResource
类找出资源的地址和大小,并将其传递给库

如果库不能获取指向数据的指针和大小,但坚持使用文件,则可以使用
QResource
QTemporaryFile
QFile::copy
将可执行文件中的数据转储到临时文件中,以便库可以使用

图书馆应该有两种接受数据的方式:

  • 进程内数据:地址+大小。例如

    setData(void * address, int size);
    
  • 进程外数据:文件路径+偏移量+大小

    setData(const char * filePath, void * offset = 0, int size = -1);
    // size = -1 uses the entire file
    
  • 这将使图书馆能够:

  • 使用进程内存中可用的二进制资源,无论它们来自
    QResource
    ,还是WINAPI资源,或者从网络下载后保存在临时缓冲区中,等等

  • 使用文件中可用的二进制资源,包括Qt和Windows资源,这些资源在可执行文件本身的偏移量处可用


  • <> P>在与Qt和C++开发花费更多的时间之后,一般来说,你不需要Qt来完成这个功能。 您需要的是修改您的构建过程,以便在构建完成后随二进制文件一起提供所需的文件

    好消息是,使用cmake实现这一点非常简单

    构建完成以下操作的cmake代码后,只需将运行时可用的任何文件复制到输出目录:

     add_custom_command(TARGET ${PROJECT} POST_BUILD
                       COMMAND ${CMAKE_COMMAND} -E copy_directory
                           ${RES_DIR} $<TARGET_FILE_DIR:${PROJECT}>/RES/)
    
    add_custom_命令(TARGET${PROJECT}POST_BUILD
    COMMAND${CMAKE_COMMAND}-E copy_目录
    ${RES_DIR}$/RES/)
    
    其中PROJECT是目标的名称


    RES_DIR:资源目录的完整路径。

    为什么不存档您的数据,并在每次需要时将其解压缩到临时目录中?因此,您的发行版将始终具有存档数据,并且您将仅在需要时解包。我目前正在将其打包为资源,并在运行时进行复制,但两者都会在安装后影响用户体验。我想考虑其他选择,然后诉诸这一点。正如我所说的图书馆需要一个路径,它处理自己访问文件。那就不行了。@Mr.Me修好图书馆吧。库至少应该接受文件的路径和偏移量。然后,您可以将库指向可执行文件本身,并提供资源所在的偏移量。如果没有,则必须使用
    QResource
    QTemporaryFile
    QFile::copy
    将资源转储到临时文件。不能只修复库,我将向库团队提出问题,但Qt应支持跨所有平台打包资产。