“Paylaşılan nesne açılamıyor” hatalarının üstesinden gelmek için kütüphanelere sembolik bağ kurmak uygun mu (yoksa değil)?


12

Bazen, bir nedenden ötürü, bir program tüm bağımlılıklarını doğru bir şekilde belirtmemiştir veya içermez ve başlatılması eksik bağımlılıkları gösteren hatalarla sonuçlanır. Tipik bir hata şuna benzer:

cannot open shared object libudev.so.0

İnsanlara /usr/libveya diğer sistem konumlarında sembolik bağlantılar yaparak bu tür problemleri çözmelerini tavsiye eden birçok cevap görüyorum ve bu genellikle sorunu çözüyor gibi görünüyor. Fakat insanlara bunun kötü bir fikir olduğunu söyleyen eşit sayıda yorum görüyorum. İşte temsili bir cevap.

Hangi koşullar altında bir programın çalışması için bir kütüphane bağlantısı yapmak kabul edilebilir? Asla? Ara sıra? Programı çalıştırdıktan sonra sembolik bağlantısı silerseniz ne olur?

Bunu yapmanın sonuçları nelerdir?

Yanıtlar:


12

Bu bağlantıları oluşturmayla ilgili sorun, anlamlı bir şekilde yönetilmemesidir. Bu kitaplık kaldırılırsa bağlantı kopar. Kitaplık yükseltilirse, orada olmasını beklemediği bağlantı nedeniyle bir hatayla karşılaşabilir.

Ayrıca, aslında sisteme yalan söylüyorsunuz. Bağlantılı örnekte, libudev.so.1aslında böyle davranıyorsunuz libudev.so.0. Bir nedenden dolayı farklı adlandırılırlar (kütüphanenin farklı sürümleri). Bu, bazı programlar için işe yarayabilse de, sürümler arasındaki farklılıkların sorunlara (segfault veya diğer beklenmedik davranışlar) neden olma potansiyeli vardır.

Bu nedenle, özellikle bir programın çalışması için bu bağlantıyı oluşturuyorsanız ve daha sonra kaldıracağınızı biliyorsanız, ilk sorunu ele alırsınız, ikincisini değil. Bu birincil sorunu ele alsa da, ideal değildir.

İdeal çözüm elbette kütüphanenin doğru sürümünü (bağlantılı örneğinizde kabul edilen cevap) kurmak veya programı sahip olduğunuz sürüme göre derlemektir.

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.