.so kütüphane dosya hatası ve çözümü

status
Published
date
Jun 27, 2020
slug
linux-so-library-file-hatasi
Published
tags
summary
Bazen sisteme yeni bir paket yüklemek istediğimde, pacman, bu paketin bir başka paketle veya bir başka paketin gereksindiği paketle çakıştığını söylüyor ve bir şeyleri silmem gerekiyor.
type
Post
Bazen sisteme yeni bir paket yüklemek istediğimde, pacman, bu paketin bir başka paketle veya bir başka paketin gereksindiği paketle çakıştığını söylüyor ve bir şeyleri silmem gerekiyor. Zaman zaman istemeden gereksiz paketler de yükleyebiliyor insan, böyle olunca bu çakışmaların da oluşması kaçınılmaz elbette.
Fakat bazen bu paketleri çalıştırmak istediğimiz aşağıdaki gibi bir hatayla karşılaşabiliyoruz.
/usr/lib/libreoffice/program/soffice.bin: error while loading shared libraries: libboost_iostreams.so.1.69.0: cannot open shared object file: No such file or directory
Burada libreoffice paketini çalıştırmaya çalıştım, fakat bana libboost_iostreams.so.1.69.0 paylaşımlı objenin (shared object) bulunmadığını söylüyor. Paylaşımlı obje, .so uzantılı dosyalardır ve esasında C/C++ çıktı dosyalarıdır. .a uzantılı dosyalar statik kütüphaneler iken, .so uzantılı dosyalar dinamik olarak linklenmiş objelerdir. Bu, programda yapılan bir değişiklik sonrasında.a uzantılı dosyaların yeniden derlenmesi gerektiğini gösterir, fakat .so dosyaları için böyle bir duruma gerek yoktur.
💡
Daha açıklayıcı bir cevap için: bakınız.
Peki bu neden böyle? Sebebi basit. Esasında bu kütüphaneleri Windows'taki .dll dosyaları gibi düşünebiliriz. Pek çok yazılım bu kütüphanelere ihtiyaç duyuyor, dolayısıyla bu kütüphanelerin dinamik olarak paylaşılması ve eksiksiz olması elzemdir. Fakat bazen karşımıza yukarıdaki gibi bir sorun çıkabilir.

Çözüm

Hataya bakacak olursak, dosya adının sonunda 1.69.0 sayılarını görebiliriz. Bu sayılar, .so dosyaları için bir versiyonlamayı ifade eder ve bu versiyonlanmış dosya, libboost_iostreams.so dosyasının yalnızca bir link dosyasıdır.
💡
Bu versiyonlama ile ilgili geniş bilgi için: bakınız.
Buradaki hatayı çözmek istersek yapmamız gereken tek şey kaynak dosyayı bularak hatada yer alan dosya adıyla bir link dosyası oluşturmak.
sudo ln -s /usr/lib/libboost_iostreams.so /usr/lib/libboost_iostreams.so.1.69.0
Bu dosyalar temel olarak /usr/lib dizini altında bulunurlar, dolayısıyla kaynak dosyayı bu dizinde aramak en mantıklısıdır. Dosyayı bulduktan sonra linklemeyi ln komutu ve -s parametresiyle kaynak dosyayı belirterek yapabiliriz. Burada dikkat edilmesi gereken en önemli nokta, dosya yolu (path) için mutlak yol (absolute path) kullanmaktır. Yani dosyanın yolunu, kökdizinden başlayarak vermeliyiz. Çünkü dosya linklerken, verilen yol için mutlak yol değeri hesaplanmaz.
Paketi tekrar çalıştırdığımızda hata muhtemelen gitmiş olacaktır, fakat benzer bir hata almanız durumunda yukarıdaki işlemi tekrarlayarak kayıp link dosyasını tekrar oluşturabilirsiniz.

Bir diğer ihtimal

Fakat bir ihtimal daha var. Bu ihtimalde paketiniz bu kez ilgili kütüphane dosyası için undefined symbol hatasını verebilir.
/usr/lib/libreoffice/program/soffice.bin: symbol lookup error: /usr/lib/libharfbuzz-icu.so.0: undefined symbol: u_countChar32_64
Bu durumda kütüphane dosyasının eski bir versiyonu bulunuyor olabilir veya bir paketi yüklerken bu kütüphane dosyasına ihtiyaç duyulmuş ve paket bu kütüphane dosyasının farklı bir versiyonunu yüklemiş olabilir. Burada yapmanız gereken iki şey var: kütüphane dosyasının paketini yeniden yüklemek veya paketin kendisini yeniden yüklemek.
Bu hatayı libreoffice paketi veriyor. Libreoffice'i silerek yeniden yükledim fakat aynı hatayla karşılaşmaya devam ediyordum. Dolayısıyla yapmam gereken şey, kütüphaneyi yeniden yüklemekti. Kütüphane adını pacman -Ss komutuyla arattım.
^^>>> sudo pacman -Ss harfbuzz
  extra/harfbuzz 2.6.8-1 [kurulu: 2.5.3-1]
    OpenType text shaping engine
  extra/harfbuzz-icu 2.6.8-1 [kurulu: 2.5.3-1]
    OpenType text shaping engine (ICU integration)
  multilib/lib32-harfbuzz 2.6.8-1 [kurulu: 2.6.5-1]
    OpenType text shaping engine (32-bit)
  multilib/lib32-harfbuzz-icu 2.6.8-1
    OpenType text shaping engine (32-bit) (ICU integration)
Karşıma çıkan sonuçlarda harfbuzz-icu kütüphane paketini gördüm ve yükledim.
💡
pacman -Ss komutu AUR sunucularında, pacman -Qs lokalde yüklü olan paketlerde arama yapar.
^^>>> sudo pacman -S harfbuzz
  paket bağımlılıkları çözümleniyor...
  varsa paketler arası çakışmalara bakılıyor...
  Paketler (2) glib2-2.64.3-2  harfbuzz-2.6.8-1
  Toplam İndirme Boyutu:   3,55 MiB
  Toplam Kurulum Boyutu:  18,97 MiB
  Güncelleme Boyutu:      0,51 MiB
Bu yükleme işleminden sonra LibreOffice'i çalıştırdığımda hata artık kaybolmuştu.

Fakat bu hatadan öğrendiğim en önemli şey, sistem güncellemelerini zaman zaman yapmam gerektiği oldu. Belki de değişiklikleri sevmeyen biri olduğum için güncellemeler konusunda diretiyordum, fakat yapmadığım zaman sistemde bir şeylerin durduk yerde bozulduğunu gördüğüm için artık haftalık olarak gerekli güncellemeleri ve yükseltmeleri alacağım.
:wq

© Samet 2017 - 2024