Создайте статическую библиотеку Linux
Для моего сайта я пытаюсь заставить работать wkhtmltopdf( ссылка). Сайт размещен на общем хостинге, что немного хлопотно при использовании библиотек, которые не установлены.
После нескольких попыток с несколькими версиями библиотеки (некоторые из которых должны были быть статическими, но я все еще получал ошибку о том, что разделяемая библиотека не найдена), я закончил тем, что связался с поставщиком, который сказал мне, что это будет работать, если у меня будет статическая версия библиотека.
Проблема в том, что мои знания Linux очень ограничены. Если я правильно понимаю, статической библиотекой будет версия wkhtmltopdf, одного файла, включая все зависимости?
В качестве официального сайта упоминаются следующие: zlib, fontconfig, freetype, X11 libs (libX11, libXext, libXrender)
Второй вопрос: не могли бы вы указать мне, где я мог бы найти пошаговое руководство по созданию такой библиотеки? так как мои исследования пока безуспешны..
1 ответ
мои знания Linux очень ограничены
Я предполагаю, что вы более или менее знакомы с Windows dll
S, которые похожи на Linux .so
s (общие объекты).
Общий объект может быть разделен (отсюда и имя) между различными программами. В большинстве случаев, когда исполняемый файл загружен, библиотека также загружается в память. Вы можете увидеть такие зависимости с ldd
,
Статическая библиотека (или статически связанная библиотека, или статический исполняемый файл, или что-то еще) - это библиотека, которая встроена в исполняемый файл во время компиляции. Чтобы статически связать вашу библиотеку, вам нужно пересобрать исполняемый файл и связать с .a
файл статической библиотеки, который похож на .lib
файлы на windows (с компилятором visual studio, как минимум, IIRC).
Это может быть хлопотно и отнимает много времени. Вот почему я советую вам пойти другим путем:
На окнах, .dll
файлы, которые находятся в той же папке, что и исполняемый файл, имеют более высокий приоритет, чем файл в пути (IIRC). В Linux (и вообще UNIX) это рассматривается как недостаток безопасности, поскольку кто-то может легко отбросить мошенника .so
файл и изменить поведение программы. Однако вы можете контролировать это поведение с помощью двух переменных среды: LD_LIBRARY_PATH
а также LD_PRELOAD
, Второй немного более мощный, и это просто своего рода инъекция "dll". Первый, однако, контролирует путь, по которому .so
файлы будут искать.
Итак, я советую вам искать необходимые зависимости с ldd
и сделайте это еще раз на вашем сервере, если можете. Ищите каждого пропавшего .so
файл. Вы можете сделать это, выполнив команду ldd wkhtmltopdf | grep not found
,
Получив этот список отсутствующих библиотек, соберите их вместе и отправьте на свой сервер (имейте в виду, что они также могут иметь некоторые зависимости). Вы, вероятно, можете найти их в локальной установке Linux с соответствующей архитектурой, но я рекомендую вам попытаться сопоставить дистрибутив с дистрибутивом вашего провайдера.
Затем выпустите wkhtmltopdf
позвонить после настройки LD_LIBRARY_PATH
переменная окружения. Вы можете сделать это так:
LD_LIBRARY_PATH='/home/me/my_libs':$LD_LIBRARY_PATH /home/me/programs/wkhtmltopdf
Обратите внимание, что я добавляю старый LD_LIBRARY_PATH
переменная в конце. Он редко выходит из коробки, но, по крайней мере, у вас не должно возникнуть никаких проблем, если вы делаете это таким образом.
Чтобы ответить на ваш комментарий: это действительно немного похоже на изменение PATH
на окнах (просто чтобы еще раз это прояснить: в Linux у вас то же самое PATH
переменная окружения, но она работает только для пути поиска исполняемых файлов; поэтому мы меняем другой LD_LIBRARY_PATH
переменная окружения для указания пути поиска библиотек).
Обратите внимание, что в приведенном выше примере, я не изменил его в масштабе всей системы, а только для вызова wkhtmltopdf
, В Windows есть несколько способов изменить PATH
переменная окружения. Вы можете открыть специальный графический интерфейс, который изменит переменную пути в реестре. Но вы также можете переопределить его локально в командной строке или пакетном скрипте. Это именно то, что я сделал здесь.
однажды LD_LIBRARY_PATH
экспортируется, он будет использоваться для каждой вызываемой вами программы, поэтому может быть опасно устанавливать его в масштабе всей системы, если у вас есть некоторые несовместимости. Более того, что бы вы ни пытались, вы не сможете настроить его для всей системы, если у вас нет прав root. Таким образом, вы можете повлиять только на ваши программы.
И последнее замечание: вы можете извлечь много зависимостей из этого проекта, так как он основан на Qt. Если вы хотите перестроить его статически, вы должны сначала собрать Qt с -static
, В следующий раз, возможно, вас заинтересует какая-то технология контейнеризации, например, докер (или даже appimages/flatpack/snap), которая предназначена для решения таких проблем.
Для дальнейшего чтения о библиотеках динамических ссылок в Linux вам может быть интересен этот ресурс или аналогичный.