Użytkownicy Linuksa często napotykają błąd ładowania bibliotek współdzielonych
podczas uruchamiania programów, jest on również znany wielu programistom i każdemu, kto chce skompilować oprogramowanie w swoim systemie. Dosłownie oznacza to, że wystąpił problem podczas ładowania bibliotek współdzielonych.
Błąd"błąd podczas ładowania bibliotek współdzielonych
" oznacza, że podczas uruchamiania programu lub skryptu system operacyjny nie mógł znaleźć i załadować jednej lub więcej bibliotek, które są niezbędne do działania tego programu. Jest to częsty problem w systemach operacyjnych typu UNIX. Gdy program jest kompilowany, może odwoływać się do różnych zewnętrznych bibliotek, które powinny być dostępne w czasie wykonywania. Jeśli brakuje tych bibliotek lub są one niedostępne, pojawia się błąd podczas ładowania bibliotek współdzielonych.
Nawet jeśli nie kompilujesz swoich programów, możesz zobaczyć ten błąd: directory_name: cannot open shared object file: No such file or directory
dość często podczas instalowania nowych programów nie za pośrednictwem menedżera pakietów lub programów przeznaczonych dla innej dystrybucji. Dzieje się tak, ponieważ system nie może znaleźć biblioteki. Dlaczego nie można jej znaleźć i załadować?
Kilka powodów, zazwyczaj wszystko sprowadza się do biblioteki, która:
Podczas rozwiązywania problemu będziemy kierować się tymi powodami i spróbujemy je rozwiązać.
Następnie rozważmy konkretne przykłady rozwiązania tego problemu w oparciu o przyczyny wymienione w poprzednim akapicie.
Nie ma tu nic skomplikowanego i wszystko jest całkiem jasne - biblioteka po prostu nie jest obecna w systemie, dlatego otrzymujemy ten błąd. Dlatego musimy znaleźć pakiet biblioteki za pomocą menedżera pakietów i zainstalować go. Zazwyczaj pakiety z bibliotekami nazywają się tak samo jak same biblioteki z przedrostkiem lib
.
Jeśli brakuje nam biblioteki libfuse2.
so, możemy ją znaleźć w Ubuntu za pomocą tego polecenia:
$ sudo apt search libfuse2
Następnie pozostaje tylko ją zainstalować:
$ sudo apt install libfuse2
Kiedy musisz zbudować program ze źródeł, będziesz musiał również zainstalować pliki nagłówkowe:
$ sudo apt install libfuse-dev
I tak dla każdej biblioteki. Ale to nie zawsze działa.
W praktyce zdarzają się przypadki, gdy biblioteka jest zainstalowana, ale błąd utrzymuje się i nie pozwala użytkownikom na normalną interakcję z systemem. Co zrobić w takim przypadku? Przede wszystkim należy sprawdzić program ładujący Linuksa, który nie może znaleźć biblioteki. Wyszukiwanie należy przeprowadzić w katalogach określonych w plikach konfiguracyjnych /etc/ld.conf.d/
. Z reguły są to /usr/lib, /lib, /usr/lib64, /lib64
. Jeśli biblioteka jest zainstalowana w innym katalogu, jest to oczywiście źródło problemu.
Możesz zobaczyć, jakie biblioteki są obecnie dostępne dla programu ładującego za pomocą polecenia:
$ ldconfig -p
Znajdź, gdzie znajduje się dana biblioteka za pomocą polecenia locate
. Na przykład, interesuje nas biblioteka librtfreader.so:
$ locate librtfreader
Gdy znamy lokalizację /opt/kingsoft/wps-office/office6/
, musimy umożliwić programowi ładującemu wykrycie biblioteki. Dodajemy ścieżkę /etc/ld.so.conf.d/
do pliku konfiguracyjnego lub do zmiennej LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=/opt/kingsoft/wps-office/office6/
Można zainstalować z dowolną biblioteką, która wywołuje błąd. Można również wybrać mniej skomplikowaną drogę polegającą na utworzeniu dowiązania symbolicznego do właściwej biblioteki we właściwym katalogu:
ln -s /opt/kingsoft/wps-office/office6/librtfreader.so /usr/lib/librtfreader.so
Zwykle dzieje się tak, gdy używasz programów dla dystrybucji, której nie masz zainstalowanej. Każda biblioteka ma dodatkową wersję, która jest zapisana po rozszerzeniu .so
. Na przykład libav.so.1
. Numer wersji zmienia się za każdym razem, gdy biblioteka jest łatana.
Często zdarza się, że w jednej dystrybucji program jest zbudowany z zależnością od biblioteki, takiej jak libc .so.1
, a w innej dystrybucji jest tylko libc.so.2
. W większości przypadków różnice są niewielkie i program może działać na drugiej wersji biblioteki. Możemy więc po prostu utworzyć dowiązanie symboliczne do niej.
Na przykład, nie ma biblioteki libusb-1.0.so.1
. Ale jest libusb-1.0.so.0.1
i możemy jej użyć:
Aby to zrobić, po prostu tworzymy dowiązanie symboliczne do biblioteki:
$ sudo ln -s /usr/lib/libusb-1.0.so.0.1 /usr/lib/libusb-1.0.so.1
Często program nie zauważy podmiany i będzie działał. Sprytnym rozwiązaniem jest znalezienie w Internecie odpowiedniej wersji biblioteki dla danej architektury i umieszczenie jej w folderze /usr/lib/
lub /usr/lib64/
. Następnie należy zaktualizować pamięć podręczną:
$ sudo ldconfig
Jeśli problem nie ustąpi po wykonaniu tych kroków, zaleca się zapoznanie się z dokumentacją programu lub systemu operacyjnego w celu uzyskania bardziej szczegółowych informacji na temat wymaganych wersji bibliotek i sposobu ich instalacji.