Wie kann ich Software ausführen, die eine ältere Bibliotheksversion erfordert?

836
Lapsio

Ich habe eine alte App, die eine alte OpenCV-Version (<= 2.4.9) erfordert und bei neueren Versionen abstürzt (OpenCV hat die Unterstützung für C-API seit 2.5 teilweise eingestellt). Früher habe ich nur ein wirklich altes Distro- und Blacklist-Opencv-Update verwendet, da diese Version überhaupt nicht mehr unterstützt wird - ich musste ein Update durchführen. Die aktuelle Version von openCV ist 3.1.

Kann ich dafür Container verwenden? Ich brauche nur diese eine Bibliothek, um alt zu sein. Ich kann altes OpenCV kompilieren, aber ich bin etwas besorgt wegen der X-Unterstützung - es handelt sich um eine grafische App, die offensichtlich eine Kamera verwendet. Oder gibt es vielleicht eine bessere Lösung?

1

1 Antwort auf die Frage

2
Horn OK Please

Das Problem, nur OpenVZ zu ersetzen, besteht darin, dass viele Bibliotheken voneinander abhängig sind (das alte "DLL Hell" -Problem). Einige Bibliotheken hängen von OpenVZ ab, und OpenVZ hängt von anderen Bibliotheken ab, die von noch mehr Bibliotheken usw. abhängen.

Je nachdem, wie alt Sie sein müssen, können Sie die Verwendung von Containern vermeiden, indem Sie eine "zusammenhängende Teilmenge" alter Bibliotheken in ein Verzeichnis einfügen und die LD_LIBRARY_PATHUmgebungsvariable verwenden, um den dynamischen Loader auf Ihre alten Bibliotheken zu richten.

Dies funktioniert normalerweise gut, wenn die Version von libstdc ++ und libc auf Ihrem Hostsystem (in / lib oder / usr / lib) ABI-kompatibel ist mit der Version, mit der Ihre alte Version von OpenCV (und deren Abhängigkeiten) kompiliert und verknüpft wurde. Im Gegensatz zum Linux-Kernel-ABI ändert sich das libc-ABI leider gelegentlich und das libstdc ++ - ABI ändert sich relativ häufig.

Wenn Sie sich also eine alte Binärdatei von OpenCV mit der Version holen, die Sie benötigen, würde dies ungefähr so ​​aussehen:

  • Versuchen Sie nur die alte OpenCV-Bibliothek im Verzeichnis LD_LIBRARY_PATH. Wenn dies nicht funktioniert, erhalten Sie eine Fehlermeldung über fehlende Bibliotheken (vorausgesetzt, die Abhängigkeiten führen zu einer korrekten Versionierung). Greifen Sie zu den fehlenden Bibliotheken und legen Sie sie in demselben Verzeichnis ab wie das alte OpenCV. Wiederholen Sie den Vorgang, bis fehlende Bibliotheksfehler verschwinden.
  • Wenn Sie an einem Punkt angelangt sind, an dem Sie in libstdc ++ oder libc auf Symbol-Lookup-Fehler stoßen, oder wenn Sie sich über schlechte Glibc-Version beschweren, befinden Sie sich in einem Bach ohne Paddel ...

Flatpak

http://flatpak.org/ - ein Paket für Anwendungspakete, das alle Abhängigkeits-Bibliotheken enthält :)

und

Behälter

Container ist ein guter Ansatz, da gute Containerlösungen wie LXC und LXD den Gast vollständig isolieren und sogar den Gast selbst betreiben PID 1(init-Daemon). Um einen Prozess unter Linux zu starten, müssen im Wesentlichen bestimmte Dinge zwischen dem, was Sie bereits ausführen, und dem, was Sie starten, kompatibel sein, da beispielsweise der dynamische Lader (libdl) die gemeinsam genutzten Bibliotheken laden muss. Container können jedoch vollständig isoliert werden, sodass Sie inkompatible Versionen von libc, libdl und libstdc ++ auf demselben Host-Kernel verwenden können.

Ich würde LXD empfehlen, wenn Sie Ubuntu> = 16.04 ausführen, oder OpenVZ, wenn Sie ein altes Debian- oder CentOS / RHEL-Hostsystem ausführen. Leider ist die Einrichtung von LXD in nicht-Ubuntu-Distributionen nicht so einfach, und OpenVZ unterstützt (noch) nicht die neuesten Distributionen.

Das Schöne am Linux-Kernel ist, dass der Linux-Kernel-ABI mit wenigen Ausnahmen für treiberspezifische Schnittstellen (wie der Direct Rendering Manager) für lange Zeit stabil ist . Das bedeutet:

  • Alte "Userspaces" (alles, was auf dem Kernel im Gegensatz zum Kernel läuft) sollten auf viel neueren Kerneln funktionieren.
  • Neue Userspaces sollten auf vielen älteren Kerneln funktionieren.

In der Praxis bedeutet dies, dass, wenn Sie nicht 3D-Grafiktreiber oder andere Arten von spezialisierter Hardware in Ihrem Container verwenden, "Just Work" unabhängig vom Altersunterschied zwischen dem Containersystem und dem Host-Kernel (bis zu einem gewissen Grad) erfolgen sollte limit; Software, die für einen Linux-Kernel älter als 2.6.9 kompiliert wurde, funktioniert normalerweise nicht auf einem modernen Kernel, und älter als 2.6.0 wird definitiv nicht funktionieren.)

Dies führt zu einer Abstufung von "minimalem Aufwand", um ältere Bibliotheken (oder Binärdateien, die von älteren Bibliotheken abhängig sind) auszuführen, je nachdem, wie alt und wie alt die Altertümer sind:

  • Minimal: Füge die alte Version der Bibliothek in ein Verzeichnis ein, setze LD_LIBRARY_PATH und fertig.
  • Typisch (dies wird bei vielen proprietären Spielen und Programmen verwendet): Wenn Sie die alte Version der Bibliothek und alle ihre Abhängigkeiten außer libc ablegen, legen Sie LD_LIBRARY_PATH fest, und Sie sind fertig.
  • Umfassender Bibliotheksersatz (fehlerhaft; funktioniert möglicherweise nicht): Wenn Sie die alte Version der Bibliothek libstdc ++, libc, libdl und alle zugehörigen Abhängigkeiten in einem Verzeichnis ablegen, legen Sie LD_LIBRARY_PATH fest und fertig.
  • Container: Installieren Sie ein komplettes Basissystem für ein anderes, älteres Betriebssystem über Ihrem Host-Kernel, ohne eine Virtualisierung auszuführen (Sie führen immer noch nur eine Kopie des Linux-Kernels aus). Schnell, benötigt aber mehrere Festplattenspeicher. Extrem kompatibel mit so ziemlich allem, was Sie darauf werfen können (einschließlich der alten Distros).
  • Virtuelle Maschinen: Sie können alles ausführen, auch Nicht-Linux-Betriebssysteme, und Kompatibilität ist kein Problem, solange die Gastbetriebssystemsoftware auf derselben CPU läuft wie Ihre Hardware.
Hmm. Ich habe immer noch eine Maschine mit diesem alten OpenCV und allen zum Kompilieren erforderlichen Bibliotheken. Kann ich altes OpenCV so kompilieren, dass es nicht auf andere Bibliotheken angewiesen ist und kompatibel ist, solange X und der Kameratreiber im Kernel kompatibel sind? (alle Abhängigkeiten einschließen)? Lapsio vor 7 Jahren 0
Oh ja - Sie können es * theoretisch auch * kompilieren *, sofern keine der von OpenCV abhängigen Bibliotheken auf Ihrem Hostsystem zu neu sind. Dies ist eine sehr spezifische Frage, die schwer zu beantworten ist, wenn Sie kein OpenCV-Betreuer sind. Mein Vorschlag an Sie ist also, dass Sie es einfach versuchen. Horn OK Please vor 7 Jahren 1
Es gibt auch Flatpak! http://flatpak.org/ Horn OK Please vor 7 Jahren 0