Eski kütüphane sürümünü gerektiren bir yazılım nasıl çalıştırılır?


1

Eski OpenCV sürümünü gerektiren (& lt; = 2.4.9) eski sürümlerde bir uygulama var ve daha yeni sürümlerde çöküyor (OpenCV 2.5'ten beri C API desteği kısmen düştü). Eskiden gerçekten gerçekten eski dağıtım ve kara liste opencv güncellemelerini kullanırdım, ancak bu sürüm artık desteklenmiyordu - güncellemek zorunda kaldım. OpenCV'nin şu anki sürümü 3.1.

Bunun için kaplar kullanabilir miyim? Yaşlanmak için sadece bir kütüphaneye ihtiyacım var. Eski OpenCV'yi derleyebilirim, ancak X desteği konusunda biraz endişeliyim - açıkçası kamera kullanan grafik uygulaması. Ya da belki daha iyi bir çözüm var?

Yanıtlar:


2

OpenVZ’in değiştirilmesindeki sorun, birçok kütüphanenin birbirine bağlı (eski "DLL Cehennem" sorunu). Bazı kütüphaneler OpenVZ'ye, OpenVZ ise daha çok kütüphaneye vb. Bağlı diğer kütüphanelere bağlıdır.

Kaç yaşında olmanız gerektiğine bağlı olarak, eski kitaplıkların "birleştirici alt kümesini" bir dizine getirerek kapları kullanmaktan kaçınabilir, ardından LD_LIBRARY_PATH Dinamik yükleyiciyi eski kütüphanelerinize yönlendiren ortam değişkeni

Bu, genellikle ana sisteminizdeki libstdc ++ ve libc sürümü (/ lib veya / usr / lib) ise iyi sonuç verir. ABI-uyumlu OpenCV'nizi (ve bağımlılıklarını) eski sürümünüzü derlemek ve bağlamak için kullanılan sürümle birlikte. Ne yazık ki, Linux çekirdeği ABI'den farklı olarak, libc ABI zaman zaman değişir ve libstdc ++ ABI nispeten sık değişir.

Yani, ihtiyaç duyduğunuz sürümde eski bir OpenCV ikili dosyasını kapmak, kabaca bu işlemle gelirdi:

  • Deneyin sadece LD_LIBRARY_PATH dizinindeki eski OpenCV kütüphanesi. Çalışmazsa, eksik kitaplıklar hakkında hata alırsınız (bağımlılıkların doğru şekilde sürüm yaptığını varsayarsak); Bu eksik kütüphaneleri kapın ve onları eski OpenCV ile aynı dizine yerleştirin. Eksik kütüphane hataları giderilinceye kadar tekrarlayın.
  • Libstdc ++ veya libc'da sembol arama hataları aldığınız bir noktaya veya kötü glibc sürümüyle ilgili şikayetlere ulaştığınız bir noktaya gelirseniz, raketsiz bir dere içersiniz ve tek çözümleriniz (sanallaştırma ve eski bir işletim sistemi sürümü dışında) ...

Flatpak

http://flatpak.org/ - tüm bağımlılık kütüphanelerini içeren bir uygulama paketleme formatı :)

ve

kaplar

Konteynerler iyi bir yaklaşım çünkü iyi LXC ve LXD gibi konteyner çözümleri konuğu tamamen izole eder ve hatta konuğu kendi kendine yönetmesine izin verir PID 1 (init daemon). Temel olarak, Linux'ta herhangi bir işlemi başlatmak için, önceden çalıştığınız ve başlattığınız işlem arasında belirli şeyler uyumlu olmalıdır, çünkü örneğin dinamik yükleyici (libdl) paylaşılan kitaplıkları yükleyebilmelidir. Ancak, kapsayıcılar bunu tamamen izole etmenin bir yolunu kullanır, böylece aynı ana bilgisayar çekirdeğinde libc, libdl ve libstdc ++ ile uyumlu olmayan sürümleri kullanabilirsiniz.

Eğer eski bir Debian veya CentOS / RHEL host sistemi kullanıyorsanız Ubuntu & gt; = 16.04 veya OpenVZ kullanıyorsanız LXD'yi tavsiye ederim. Maalesef LXD'nin Ubuntu olmayan dağıtımlara kurulması çok kolay değil ve OpenVZ (henüz) en son dağıtımları desteklemiyor.

Linux çekirdeği hakkındaki güzel şey, sürücüye özgü arabirimler (Direct Rendering Manager gibi) için birkaç istisna dışında, Linux çekirdeği ABI’nin kararlı uzun zamandır. Bunun anlamı:

  • Eski "kullanıcı alanları" (iç kısmın aksine çekirdeğin üstünden geçen her şey) oldukça yeni çekirdeklerde çalışmalıdır.
  • Yeni kullanıcı alanları oldukça eski çekirdeklerde çalışmalıdır.

Uygulamada bunun anlamı, kabınızdaki 3d grafik sürücülerini veya diğer özel donanım türlerini kullanmadığınız sürece, konteyner sistemi ile ana bilgisayar çekirdeği arasındaki yaş farkından bağımsız olarak "Sadece Çalışması" gerektiğidir (belirli bir dereceye kadar) limit: 2.6.9'dan daha eski olan Linux çekirdeği için derlenen yazılımlar genellikle modern bir çekirdek üzerinde çalışmayacaktır ve 2.6.0'dan daha eski kesinlikle çalışmayacaktır.)

Bu, yaşlılıkların ne kadar eski ve ne kadar derin gittiğine bağlı olarak, eski kütüphaneleri (veya eski kütüphanelere bağlı olan ikili dosyaları) çalıştırmak için gereken "asgari çaba" derecesini bırakır:

  • Minimal: Kütüphanenin eski versiyonunu bir dizine bırakın, LD_LIBRARY_PATH değerini ayarlayın.
  • Tipik (birçok özel oyun ve programla kullanılır): Kütüphanenin eski sürümünü ve tüm bağımlılıklarını bırakın dışında libc, LD_LIBRARY_PATH değerini ayarlayın, işiniz bitecek.
  • Kapsamlı kütüphane değişimi (buggy; çalışmayabilir): Kütüphanenin eski sürümünü, libstdc ++, libc, libdl ve tüm bağımlılıklarını bir dizine bırakın, LD_LIBRARY_PATH ve bitirdiniz.
  • Kapsayıcılar: Sanallaştırma çalıştırmadan, başka bir eski işletim sistemi için ana çekirdeğinizin üzerine tam bir temel sistem kurun (hala Linux çekirdeğinin yalnızca bir kopyasını çalıştırıyorsunuz). Hızlı , ancak birkaç konser disk alanı kaplar. Son derece Atlayabileceğiniz hemen hemen her şeyle uyumlu (eski dağıtımlar dahil)
  • Sanal makineler: Linux işletim sistemi olmayan herhangi bir şey bile çalıştırabilir ve konuk işletim sistemi yazılımı donanımınızla aynı CPU üzerinde çalıştığı sürece uyumluluk kaygı verici değildir.

Hmm. O eski OpenCV'ye sahip bir makinem var ve derlemek için gereken tüm kütüphaneler var. Eski OpenCV'yi diğer kütüphanelere dayanmayacak şekilde derleyebilir ve çekirdekteki X ve kamera sürücüsü uyumlu olduğu sürece uyumlu olabilir miyim? (tüm bağımlılıkları dahil)?
Lapsio

1
Ah evet - ayrıca derlemek Teorik olarak, OpenCV’lerin bağlı olduğu liblerin hiçbiri ana sisteminizde çok yeni olmadığı sürece. Bu çok özel bir soru ve bir OpenCV sorumlusu olmadığınız sürece cevaplaması zor olan bir soru, bu yüzden size önerim, sadece denemeniz.
allquixotic

Flatpak da var! flatpak.org
allquixotic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.