Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование Zstandard в Lazarus без DLL: решение для Windows

Delphi , Синтаксис , API реализация

 

Введение

Zstandard (Zstd) — это современный алгоритм сжатия, разработанный Facebook, который обеспечивает высокую скорость сжатия и декомпрессии при отличном коэффициенте сжатия. Однако в Lazarus и Free Pascal отсутствует нативная реализация Zstandard, что вынуждает разработчиков использовать внешние DLL-библиотеки. В этой статье мы рассмотрим решение, позволяющее использовать Zstandard в проектах Lazarus без необходимости распространять отдельные DLL-файлы, а также альтернативные подходы.

Проблема использования Zstandard в Lazarus

Основная сложность при работе с Zstandard в Lazarus заключается в отсутствии встроенной поддержки этого алгоритма. Традиционно для этого используются динамические библиотеки (DLL), что создаёт несколько проблем:

  1. Необходимость распространять DLL вместе с EXE — усложняет дистрибуцию приложения.
  2. Антивирусы могут блокировать DLL — особенно если они запакованы или изменены.
  3. Зависимость от версии библиотеки — пользователь должен иметь правильную версию DLL.

Решение: встраивание DLL в EXE

Один из подходов, предложенных пользователем domasz, заключается во встраивании DLL-библиотеки в исполняемый файл и её извлечении во временную папку при запуске программы.

Пример реализации

uses
  ZSTDLib, ZSTD, Classes, SysUtils;

const
  BufSize = 40960000;

var
  InF, OutF: TFileStream;
  Z: TZSTDCompressStream;
  Len: Integer;
  Buf: array of Byte;
  Options: TZSTDCompressOptions;
  c1, c2, f: Int64;
begin
  // Указываем путь к временной DLL
  ZSTDDllName := GetTempDir + 'libzstd.dll';

  // Если DLL нет во временной папке — создаём её
  if not FileExists(ZSTDDllName) then 
  begin
    OutF := TFileStream.Create(ZSTDDllName, fmCreate);
    OutF.Write(ZStdBody, Length(ZStdBody)); // ZStdBody — массив с бинарными данными DLL
    OutF.Free;
  end;

  // Замер времени выполнения
  QueryPerformanceFrequency(f);
  QueryPerformanceCounter(c1);

  // Сжатие файла
  InF := TFileStream.Create('input.dat', fmOpenRead);
  OutF := TFileStream.Create('output.zst', fmCreate);

  Options.Init;
  Options.CompressionLevel := 3; // Уровень сжатия (1-22)

  Z := TZSTDCompressStream.Create(OutF, Options);
  SetLength(Buf, BufSize);

  while InF.Position < InF.Size do 
  begin
    Len := InF.Read(Buf[0], BufSize);
    Z.Write(Buf[0], Len);
  end;

  Z.Free;
  InF.Free;
  OutF.Free;

  // Удаление временной DLL (опционально)
  // DeleteFile(ZSTDDllName);

  QueryPerformanceCounter(c2);
  ShowMessage(Format('Сжатие заняло %f секунд', [(c2 - c1) / f]));
end.

Преимущества этого подхода

  • Один EXE-файл — не нужно распространять DLL отдельно.
  • Антивирусы не блокируют — в отличие от загрузки DLL из памяти.
  • Простота обновления — можно легко заменить встроенную DLL на новую версию.

Альтернативное решение: статическая линковка

Пользователь Fibonacci предложил альтернативный метод — статическую линковку библиотеки Zstandard.

Как это работает

  1. Необходимо иметь статическую библиотеку libzstd.a.
  2. Подключить её в проекте через директиву {$linklib}.

Пример:

{$linklib libzstd.a}
{$linklib libgcc.a}
{$linklib libkernel32.a}
{$linklib libucrt.a}

Где взять libzstd.a?

Статические библиотеки можно найти:
- В MinGW (mingw-w64-x86_64-zstd).
- В официальных релизах Zstandard на GitHub (раздел "Static").

Преимущества статической линковки

  • Нет временных файлов — DLL не извлекается на диск.
  • Лучшая производительность — отсутствуют накладные расходы на загрузку DLL.

Сравнение методов

Метод Преимущества Недостатки
Встраивание DLL Простота реализации, совместимость Временный файл DLL на диске
Статическая линковка Максимальная производительность Требует сборки библиотеки под платформу

Заключение

Оба рассмотренных метода позволяют использовать Zstandard в Lazarus без необходимости распространять DLL. Выбор зависит от конкретных требований проекта:

  • Для простых проектов подойдёт встраивание DLL.
  • Для максимальной оптимизации лучше использовать статическую линковку.

Рекомендуется также рассмотреть встроенные альтернативы, такие как zlib (хотя Zstandard обычно быстрее и эффективнее).

Дополнительные ресурсы

Если у вас есть вопросы или предложения — делитесь в комментариях! 🚀

Создано по материалам из источника по ссылке.

Использование Zstandard в Lazarus без DLL: решение для встраивания библиотеки в EXE или статической линковки для работы с алгоритмом сжатия в Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: API реализация ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-27 09:34:40/0.0040199756622314/0