Zstandard (Zstd) — это современный алгоритм сжатия, разработанный Facebook, который обеспечивает высокую скорость сжатия и декомпрессии при отличном коэффициенте сжатия. Однако в Lazarus и Free Pascal отсутствует нативная реализация Zstandard, что вынуждает разработчиков использовать внешние DLL-библиотеки. В этой статье мы рассмотрим решение, позволяющее использовать Zstandard в проектах Lazarus без необходимости распространять отдельные DLL-файлы, а также альтернативные подходы.
Проблема использования Zstandard в Lazarus
Основная сложность при работе с Zstandard в Lazarus заключается в отсутствии встроенной поддержки этого алгоритма. Традиционно для этого используются динамические библиотеки (DLL), что создаёт несколько проблем:
Необходимость распространять DLL вместе с EXE — усложняет дистрибуцию приложения.
Антивирусы могут блокировать DLL — особенно если они запакованы или изменены.
Зависимость от версии библиотеки — пользователь должен иметь правильную версию 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.
Как это работает
Необходимо иметь статическую библиотеку libzstd.a.
Подключить её в проекте через директиву {$linklib}.
Статические библиотеки можно найти:
- В 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