Вложение сжатых файлов в программу на С ++ - PullRequest
0 голосов
/ 29 марта 2011

Я хочу создать кроссплатформенный инсталлятор на c ++.Это может быть любой тип сжатия, например zip или gzip, встроенный в саму программу, как обычный установщик.Я не хочу создавать много изменений на разных платформах, Linux и Windows.Как встраивать и извлекать файлы в кроссплатформенную программу на С ++?

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

C ++ - плохой выбор для кроссплатформенного установщика, потому что нет такого понятия, как кроссплатформенный машинный код.

Код C ++ может быть чрезвычайно переносимым, но его нужно компилировать для каждой платформы,и затем вы получите отдельный выходной исполняемый файл для каждой платформы.

Если вы хотите собрать установщики для многих платформ из одного исходного файла, вы можете использовать C ++.Но если вы хотите создать ОДИН установщик, который работает на многих платформах, вам нужно использовать интерпретированный или JIT-скомпилированный язык с поддержкой времени выполнения, доступной для всех ваших целей.Из них единственным, который, вероятно, уже установлен на большинстве компьютеров каждой платформы, является Java.


Хорошо, если предположить, что вы собираете много одноплатформенных инсталляторов из машинного кода, эточто нужно:

Вам необходимо получить сжатый код в программу.Вы хотите сделать это так, чтобы это не повлияло на время загрузки и не привело к тому, что компиляция заняла бы несколько месяцев.Поэтому использование инициализированного глобального массива - плохая идея.

Один из способов - связать ваши данные в качестве дополнительного раздела.Есть инструменты, которые помогут с этим, например Конвертер двоичных в COFF , я также видел версию ELF, возможно это .Но это все равно может привести к тому, что библиотека времени выполнения попытается привести весь файл в память до начала выполнения.

Другой способ - использовать API ресурсов для конкретной платформы.Это эффективно, но зависит от платформы.

Самое простое решение - просто добавить сжатый архив в исполняемый файл, а затем добавить еще восемь байтов со смещением файла в том месте, где начинается сжатый архив.Распаковка выполняется так же просто, как открытие исполняемого файла в режиме «только для чтения», fseek(-8, SEEK_END), чтение правильного смещения, поиск в начале сжатых данных и передача этого потока в декомпрессор.


Конечно, теперь я нахожу веб-сайт с почти такими же методами .

и , вот программа, которая реализует последнюю опцию с дополнительной возможностью хранить несколько файлов,Я бы не рекомендовал делать это, пусть библиотека сжатия позаботится о сохранении метаданных файла.

0 голосов
/ 29 марта 2011

Используйте zlib.

Попросите вашу упаковочную программу сгенерировать список исполняемых файлов в программе.я, е.

unsigned char x86_windows_version[] = { 0xff,...,0xff};
unsigned char arm_linux_version[] = { 0xff,...,0xff};

unsigned char* binary_files[MAX_BINARIES] = {x86_windows_version,arm_linux_version};

где-то в вашем возбуждении:

enflate(x86_windows_version);

И это все.Посмотрите в документации по zlib параметры enflate () и deflate (), и все.

Этот шаблон часто используется на встроенных платформах (не linux), в основном для строковых _tables и других двоичных файлов изображений.,Это должно работать для ваших нужд.

0 голосов
/ 29 марта 2011

Единственный известный мне способ переносить данные (строки или необработанные двоичные данные) в программу на C ++ - это преобразовать их в таблицу данных, а затем скомпилировать.Для необработанных данных это выглядело бы примерно так:

unsigned char data[] =
{
    //  raw data here.
};

Было бы довольно тривиально написать небольшую программу, которая читает ваши двоичные данные и записывает их в виде таблицы C ++, как показано выше.Скомпилируйте его и включите в свою программу, и вот вы где.

...