Як запустити програмне забезпечення, яке вимагає застарілої бібліотечної версії?


1

У мене є старий додаток, який вимагає старої версії OpenCV (<= 2.4.9) і збоїв у нових версіях (OpenCV частково відмовилася від підтримки API API з 2.5). Раніше я використовував справді старе оновлення дистрибутива та чорного списку opencv, однак цей випуск більше не підтримується - я був змушений оновити. Поточна версія openCV - 3.1.

Чи можу я використовувати для цього контейнери? Мені потрібна лише ця одна бібліотека, щоб вона була стара. Я можу скласти старий OpenCV, проте мене трохи хвилює підтримка X - це графічне додаток, яке, очевидно, використовує камеру. А може, є краще рішення?

Відповіді:


2

Проблема просто заміни OpenVZ полягає в тому, що багато бібліотек залежать одна від одної (стара проблема "DLL Hell"). Деякі бібліотеки залежать від OpenVZ, а OpenVZ залежить від інших бібліотек, які залежать від ще більшої кількості бібліотек тощо.

Залежно від того, скільки років вам потрібно пройти, ви можете уникати використання контейнерів, вводячи в каталог "згуртовану підмножину" старих бібліотек, а потім використовувати LD_LIBRARY_PATHзмінну середовища для наведення динамічного завантажувача на ваші старі лібри.

Зазвичай це добре працює, якщо версія libstdc ++ та libc у вашій хост-системі (in / 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 daemon). В основному, для запуску будь-якого процесу в Linux певні речі повинні бути сумісні між тим, що ви вже працюєте, і тим, що ви починаєте, тому що, наприклад, динамічний завантажувач (libdl) повинен мати можливість завантажувати спільні бібліотеки. Але контейнери мають змогу повністю їх ізолювати, тож ви можете використовувати несумісні версії libc, libdl та libstdc ++ у тому ж ядрі хоста.

Я рекомендую LXD, якщо ви запускаєте Ubuntu> = 16.04, або OpenVZ, якщо ви використовуєте стару хост-систему Debian або CentOS / RHEL. На жаль, LXD не надто простий у налаштуванні на не-Ubuntu дистрибутиви, а OpenVZ не (ще) підтримує останні дистрибутиви.

Приємне в ядрі Linux полягає в тому, що, за кількома винятками для специфічних для драйверів інтерфейсів (наприклад, менеджер прямого рендерінгу), ядро ​​Linux ABI стабільно тривалий час. Це означає:

  • Старі "простори користувачів" (усе, що працює над ядром, а не всередині нього) повинні працювати на набагато новіших ядрах.
  • Нові простори користувачів повинні працювати на досить багато старих ядер.

На практиці це означає, що якщо ви не використовуєте тривимірні графічні драйвери або інше спеціалізоване обладнання у вашому контейнері, воно повинно "Просто працювати" незалежно від різниці у віці між контейнерною системою та ядром хоста (до певного ліміт; програмне забезпечення, скомпільоване для ядра Linux старше 2.6.9, як правило, не працює на сучасному ядрі, а старше 2.6.0 точно не працюватиме.)

Це залишає градацію "мінімальних зусиль, необхідних" для запуску старих бібліотек (або бінарних файлів, які залежать від старих бібліотек), залежно від того, скільки років і наскільки глибока старість:

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

Хм. У мене ще є одна машина зі старим OpenCV і всі лібри, необхідні для її компіляції. Чи можу я скласти старий OpenCV таким чином, щоб він не покладався на інші бібліотеки і був сумісний до тих пір, поки X та драйвер камери в ядрі сумісні? (включити всі залежності)?
Лапсіо

1
Так, так - ви також можете теоретично їх скласти , якщо тільки будь-яка з ліб, від якої залежить OpenCV, не надто нова для вашої хост-системи. Це дуже специфічне запитання, на яке важко відповісти, якщо ви не підтримуєте OpenCV, тож я вам пропоную лише спробувати.
allquixotic

Там також є flatpak! flatpak.org
allquixotic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.