Я работаю над проектом 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, которые доступны со смещением в самом исполняемом файле.
Поэтому, потратив больше времени на разработку 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/)
где PROJECT — имя цели.
RES_DIR: полный путь к каталогу ресурсов.