Вопрос: Как запустить программное обеспечение, которое требует устаревшей версии библиотеки?


У меня есть старое приложение, для которого требуется старая версия OpenCV (<= 2.4.9) и сбои в более новых версиях (OpenCV частично отказался от поддержки API C с 2,5). Раньше я использовал только действительно старое дистрибутив и опцию blacklist opencv, но поскольку эта версия больше не поддерживается, я был вынужден обновить. Текущая версия openCV - 3.1.

Можно ли использовать для этого контейнеры? Мне нужна только эта библиотека, чтобы быть старой. Я могу скомпилировать старый OpenCV, но я немного обеспокоен поддержкой X - это графическое приложение, которое, очевидно, использует камеру. Или, может быть, есть лучшее решение?


1
2018-04-07 20:30


Источник




Ответы:


Проблема с заменой OpenVZ заключается в том, что многие библиотеки зависят друг от друга (старая проблема «DLL Hell»). Некоторые библиотеки зависят от OpenVZ, а OpenVZ зависит от других библиотек, которые зависят от еще большего количества библиотек и т. Д.

В зависимости от того, сколько лет вам нужно, вы можете избежать использования контейнеров, введя «связный поднабор» старых библиотек в каталог, затем используйте LD_LIBRARY_PATH переменную окружения, чтобы указать динамический загрузчик в ваших старых библиотеках.

Это обычно хорошо работает, если версия libstdc ++ и libc на вашей хост-системе (в / lib или / usr / lib) ABI-совместимый с версией, которая использовалась для компиляции и связывания старой версии OpenCV (и ее зависимостей). К сожалению, в отличие от ядра Linux ABI, libc ABI изменяется иногда, а libstdc ++ ABI изменяется относительно часто.

Итак, захват старого двоичного кода OpenCV с нужной вам версией будет примерно таким же:

  • Пытаться просто старой библиотеки OpenCV в каталоге LD_LIBRARY_PATH. Если это не сработает, вы получите ошибки в отношении недостающих библиотек (при условии, что зависимости корректно выполняют управление версиями); пойдите, захватите те недостающие библиотеки и поместите их в тот же каталог, что и старый OpenCV. Повторяйте до тех пор, пока не исчезнут ошибки библиотеки.
  • Если вы доберетесь до точки, в которой вы получаете ошибки поиска символов в libstdc ++ или libc, или жалобы на плохую версию glibc, вы за рулем без весла, и ваши единственные решения (кроме виртуализации и установки старой версии ОС) ...

Flatpak

http://flatpak.org/ - формат упаковки приложений, который включает все библиотеки зависимостей :)

а также

Контейнеры

Контейнеры - хороший подход, потому что хорошо контейнерные решения, такие как LXC и LXD, полностью изолируют гостя и даже позволяют гостю запускать собственные PID 1 (демон init). В принципе, для запуска любого процесса в Linux некоторые вещи должны быть совместимы между тем, что вы уже используете, и тем, что вы запускаете, потому что, например, динамический загрузчик (libdl) должен иметь возможность загружать разделяемые библиотеки. Но контейнеры имеют способ полностью изолировать это, поэтому вы можете использовать несовместимые версии libc, libdl и libstdc ++ в одном и том же ядре.

Я бы рекомендовал LXD, если вы запустите Ubuntu> = 16.04 или OpenVZ, если вы запустите старую систему Debian или CentOS / RHEL. К сожалению, LXD не так-то просто настроить на дистрибутивах, отличных от Ubuntu, и OpenVZ пока не поддерживает последние дистрибутивы.

Самое приятное в ядре Linux заключается в том, что, за некоторыми исключениями для интерфейсов, специфичных для драйвера (например, Direct Rendering Manager), ядро ​​Linux ABI стабильный долгое время. Это значит:

  • Старые «пользовательские пространства» (все, что работает поверх ядра, а не внутри него) должны работать на довольно много новых ядер.
  • Новые пользовательские пространства должны работать на довольно старых ядрах.

На практике это означает, что, если вы не используете в своем контейнере графические драйверы 3D или другие виды специализированного оборудования, он должен «просто работать» независимо от разницы в возрасте между контейнерной системой и ядром хоста (до определенного limit, программное обеспечение, скомпилированное для ядра Linux старше 2.6.9, обычно не будет работать на современном ядре, а более раннее, чем 2.6.0, определенно не будет работать.)

Это оставляет градацию «минимальных усилий» для запуска более старых библиотек (или двоичных файлов, которые зависят от более старых библиотек), в зависимости от того, сколько лет и насколько глубока старость:

  • Минимальное: перетащите старую версию библиотеки в каталог, установите LD_LIBRARY_PATH, и все готово.
  • Типичный (используется со многими проприетарными играми и программами): отбросьте старую версию библиотеки и все ее зависимости кроме libc, установите LD_LIBRARY_PATH, и все готово.
  • Обширная замена библиотеки (багги, возможно, не работает): отбросьте старую версию библиотеки, libstdc ++, libc, libdl и все ее зависимости в каталог, установите LD_LIBRARY_PATH, и все готово.
  • Контейнеры: установите полную базовую систему для другой, более старой ОС поверх ядра вашего хоста без какой-либо виртуализации (вы все еще используете только одну копию ядра Linux). Быстро, но занимает несколько концертов дискового пространства. чрезвычайно совместимый практически со всем, что вы можете бросить на него (включая древние дистрибутивы).
  • Виртуальные машины: могут запускать что-либо, даже не-Linux-ОС, а совместимость не вызывает беспокойства, если программное обеспечение гостевой ОС работает на том же процессоре, что и ваше оборудование.

2
2018-04-07 21:37



Хм. У меня все еще есть одна машина с этим старым OpenCV и всеми libs, необходимыми для ее компиляции. Могу ли я скомпилировать старый OpenCV таким образом, что он не будет полагаться на другие библиотеки и быть совместимым, если X и драйвер камеры в ядре совместимы? (включая все зависимости)? - Lapsio
О, да, вы также можете компилировать это, теоретически, если ни одна из libs OpenCV не зависит от того, являются слишком новыми для вашей хост-системы. Это очень конкретный вопрос, и трудно ответить, если вы не поддерживаете OpenCV, поэтому мое предложение для вас заключается в том, что вы просто попробуете его. - allquixotic
Там тоже плоский пак! flatpak.org - allquixotic