Jak uruchomić oprogramowanie, które wymaga starszej wersji biblioteki?

1

Mam starą aplikację, która wymaga starej wersji OpenCV (& lt; = 2.4.9) i zawiesza się w nowszych wersjach (OpenCV częściowo upuścił obsługę C API od 2.5). Kiedyś używałem naprawdę bardzo starej aktualizacji opencv do dystrybucji i czarnej listy, ponieważ ta wersja nie jest już w ogóle obsługiwana - byłem zmuszony do aktualizacji. Aktualna wersja openCV to 3.1.

Czy mogę do tego użyć pojemników? Potrzebuję tylko jednej biblioteki, aby być starą. Mogę skompilować stary OpenCV, ale trochę się martwię o obsługę X - to aplikacja graficzna, która w oczywisty sposób używa aparatu. A może jest lepsze rozwiązanie?

Lapsio
źródło

Odpowiedzi:

2

Problem z zastąpieniem OpenVZ polega na tym, że wiele bibliotek zależą od siebie (stary problem „DLL Hell”). Niektóre biblioteki zależą od OpenVZ, a OpenVZ zależy od innych bibliotek, które zależą od jeszcze większej liczby bibliotek itp.

W zależności od tego, ile masz lat, możesz uniknąć używania kontenerów, wprowadzając do katalogu „spójny podzbiór” starych bibliotek, a następnie użyć LD_LIBRARY_PATH zmienna środowiskowa, aby wskazać program ładujący dynamicznie na stare biblioteki.

Zwykle działa to dobrze, jeśli wersja libstdc ++ i libc w systemie hosta (w / lib lub / usr / lib) jest Kompatybilny z ABI z wersją, która została użyta do skompilowania i połączenia twojej starej wersji OpenCV (i jej zależności). Niestety, w przeciwieństwie do ABI w jądrze Linuksa, libi ABI zmienia się czasami, a libstdc ++ ABI zmienia się stosunkowo często.

Tak więc, złapanie starego pliku binarnego OpenCV z wersją, której potrzebujesz, byłoby mniej więcej z tym procesem:

  • Próbować właśnie stara biblioteka OpenCV w katalogu LD_LIBRARY_PATH. Jeśli to nie zadziała, dostaniesz błędy o brakujących bibliotekach (zakładając, że zależności wykonują poprawne wersjonowanie); chwyć te brakujące biblioteki i umieść je w tym samym katalogu co stary OpenCV. Powtarzaj, aż znikną błędy biblioteki.
  • Jeśli dojdziesz do punktu, w którym dostaniesz błędy wyszukiwania symboli w libstdc ++ lub libc, lub skargi dotyczące złej wersji glibc, jesteś w potoku bez wiosła, a jedynymi rozwiązaniami (innymi niż wirtualizacja i instalacja starej wersji systemu operacyjnego) są ...

Flatpak

http://flatpak.org/ - format pakowania aplikacji zawierający wszystkie biblioteki zależności :)

i

Kontenery

Kontenery to dobre podejście, ponieważ dobry rozwiązania pojemnikowe, takie jak LXC i LXD, całkowicie izolują gościa, a nawet pozwalają gościowi działać samodzielnie PID 1 (demon inicjujący). Zasadniczo, aby rozpocząć dowolny proces na Linuksie, pewne rzeczy muszą być zgodne między tym, co już uruchomiłeś, a tym, co uruchamiasz, ponieważ na przykład dynamiczny program ładujący (libdl) musi być w stanie załadować biblioteki współdzielone. Ale kontenery mają sposób na całkowitą izolację, więc możesz używać niekompatybilnych wersji libc, libdl i libstdc ++ na tym samym jądrze hosta.

Polecam LXD, jeśli używasz Ubuntu> = 16.04, lub OpenVZ, jeśli używasz starego systemu hosta Debian lub CentOS / RHEL. Niestety LXD nie jest zbyt łatwy do skonfigurowania na dystrybucjach innych niż Ubuntu, a OpenVZ nie obsługuje (jeszcze) najnowszych dystrybucji.

Dobrą rzeczą w jądrze Linuksa jest to, że z kilkoma wyjątkami dla interfejsów specyficznych dla sterownika (takich jak Direct Rendering Manager), jądro Linux ABI jest stabilny przez długi czas. To znaczy:

  • Stare „przestrzenie użytkownika” (wszystko, co działa na wierzchu jądra, a nie wewnątrz niego) powinno działać na znacznie nowszych jądrach.
  • Nowe obszary użytkownika powinny działać na dużo starszych jądrach.

W praktyce oznacza to, że jeśli nie używasz sterowników grafiki 3d lub innego rodzaju specjalistycznego sprzętu w kontenerze, powinien on „Po prostu działać” niezależnie od różnicy wieku między systemem kontenerowym a jądrem hosta (do pewnego limit; oprogramowanie skompilowane dla jądra Linux starszego niż 2.6.9 na ogół nie będzie działać na nowoczesnym jądrze, a starsze niż 2.6.0 na pewno nie będzie działać.)

Pozostawia to gradację „minimalnego wysiłku wymaganego” do uruchomienia starszych bibliotek (lub plików binarnych zależnych od starszych bibliotek), w zależności od tego, ile lat i jak głęboko sięga starość:

  • Minimal: Upuść starą wersję biblioteki do katalogu, ustaw LD_LIBRARY_PATH i gotowe.
  • Typowe (jest to używane z wieloma zastrzeżonymi grami i programami): upuść starą wersję biblioteki i wszystkie jej zależności z wyjątkiem libc, ustaw LD_LIBRARY_PATH i gotowe.
  • Rozbudowana biblioteka (buggy; może nie działać): upuść starą wersję biblioteki, libstdc ++, libc, libdl i wszystkie jej zależności do katalogu, ustaw LD_LIBRARY_PATH i gotowe.
  • Kontenery: Zainstaluj kompletny system bazowy dla innego, starszego systemu operacyjnego na wierzchu jądra hosta bez uruchamiania wirtualizacji (nadal działa tylko jedna kopia jądra Linux). Szybki , ale zajmuje kilka koncertów na dysku. Niezwykle kompatybilny z niemal wszystkim, co możesz na niego rzucić (w tym starożytne dystrybucje).
  • Maszyny wirtualne: mogą uruchamiać wszystko, nawet systemy operacyjne inne niż Linux, a kompatybilność nie stanowi problemu, o ile oprogramowanie systemu gościa działa na tym samym procesorze, co sprzęt.
allquixotic
źródło
Hmm. Nadal mam jedną maszynę z tym starym OpenCV i wszystkie biblioteki wymagane do jej skompilowania. Czy mogę skompilować stary OpenCV w taki sposób, aby nie polegał na innych bibliotekach i był kompatybilny tak długo, jak X i sterownik aparatu w jądrze są kompatybilne? (obejmują wszystkie zależności)?
Lapsio
1
Och, tak - ty też możesz skompilować w teorii, chyba że którykolwiek z bibliotek, od których zależy OpenCV, jest zbyt nowy w systemie hosta. Jest to bardzo specyficzne pytanie, na które trudno odpowiedzieć, chyba że jesteś opiekunem OpenCV, więc moja sugestia jest taka, że ​​po prostu spróbuj.
allquixotic
Jest też flatpak! flatpak.org
allquixotic