sobota, 21 maja 2016

Program nie może się uruchomić, bowiem brakuje jakiejś biblioteki

Osoby użytkujące Arch Linux w stabilnej wersji nigdy nie powinny się spotkać z omawianym tu "błędem". Niemniej jednak tylko wówczas, gdy ograniczą się do stosowania programów znajdujących się w oficjalnych repozytoriach. Tu bowiem osoby odpowiedzialne za utrzymywanie paczek, z chwilą, gdy dochodzi do zmian jakichś bibliotek dbają o przebudowanie paczek i dostosowanie ich do nowych wersji. Niemniej jednak wielu z używających Archa buduje paczki także z AUR. Najczęściej to właśnie programy pochodzące z AUR nagle zaprzestaną działać. Przypomnę, albowiem szczególnie dla osób, które zmieniły dystrybucję z *buntupochodnych na Archa, czy - częściej - Manjaro: w AUR nie znajdują się żadne paczki. Tu są wyłącznie "przepisy" na podstawie których następuje lokalne budowanie paczki i jej instalacja. Jeśli jednocześnie opiekun takiej aplikacji w AUR "nie zauważy", że dokonane zostały jakieś zmiany w repozytoriach, które wymagają jego reakcji lub nawet pomimo tego, my nie przebudujemy takiej paczki, to spotkać się możemy z sytuacją, w której wczoraj jeszcze działająca aplikacja nagle przestała działać. Uruchamiając taką aplikację w środowiskach graficznych najczęściej po prostu nic się nie wydarzy. Klikniemy na nazwę aplikacji, ta jakby się uruchamiała, ale po chwili nie ma jej śladu.
W takiej sytuacji najlepiej jest wywołać program z konsoli. Wówczas - być może - czegoś się dowiemy. Bardzo często będzie to informacja typu ("foo" jest tu dowolną nazwą):
(...) /usr/lib/foo.so.1 don't exist
Jeśli zobaczymy, że jest to jakiś plik, którego rozszerzenie to so, so.CYFRA, to chodzi o to, że program, który uruchamiamy - jeśli wcześniej się uruchamiał - nie jest przeznaczony do działania z wersją biblioteki, jaką mamy aktualnie w systemie. Jeśli w konsoli nie uzyskamy informacji o miejscu położenia biblioteki, to w pierwszej kolejności lokalizujemy ją. Skorzystamy z polecenia locate (jeśli ktoś w systemie nie ma, to można zainstalować paczkę mlocate, bądź posłużyć się jakimkolwiek innym programem przeszukującym dysk za plikami, np. na pewno zainstalowanym find).
locate foo.so.1
W ten sposób uzyskamy lokalizację tej biblioteki. Teraz korzystamy z pacmana:
pacman -Qo /usr/lib/foo.so.1
W wyniku uzyskamy informację do jakiej paczki należy /usr/lib/foo.so.1. Powiedzmy, że jest to paczka foo w wersji 1.2.3.
Przydałoby się dowiedzieć jaką wersję tej paczki oferuje Arch w repozytorium stabilnym i pozostałych. Znów skorzystamy z pacmana bądź yaourta:
pacman -Ss foo
lub jeśli mamy ją z AUR np.:
yaourt foo
Powinno nas to naprowadzić na to, skąd mamy zainstalowaną paczkę. Możemy jeszcze sprawdzić informacje o tym czyją jest zależnością, czy też w jaki sposób została ona zainstalowana:
pacman -Qi foo
Możemy przeglądnąć również dziennik logów pacmana, by dowiedzieć się kiedy, przy jakiej okazji tę paczkę zainstalowaliśmy. Znajduje się on w pliku /var/log/pacman.log. Jest to plik tekstowy, zatem przeglądać można go w dowolny sposób. W AUR znajduje się jednak wygodna przeglądarka tego pliku o nazwie pacmanviewer.
Wyposażeni w taką wiedzę powinniśmy teraz zadecydować, czy:
- cofnąć paczkę do działającej wersji (ale uwaga, wówczas inny program, który ściągnął właśnie tę bibliotekę w obecnej wersji może przestać działać),
- spróbować skompilować niedziałający program w oparciu o nową bibliotekę,
- (tak są jeszcze inne rozwiązania, ale na tyle ryzykowne i niepolecane, że nie będę o nich pisać; część z nas je zna, jeśli zna, to te rozwiązania są wyłącznie do nich adresowane, albowiem trzeba być bardzo mocno świadomym, co robimy i dlaczego; w związku z tym nie będę ich tu polecać).
Pierwsze dokonujemy - najwygodniej - narzędziem downgrade (jest w AUR). W drugim przypadku polecam następujące działanie:
yaourt -G foo && cd foo
Ściągnęliśmy "przepisy" umożliwiające budowę paczki i przeszliśmy do katalogu, w którym się one znajdują.
Teraz trzeba przeglądnąć PKGBUILD, albowiem, być może będzie on wymagać właśnie określonej wersji biblioteki. Jeśli tak jest możemy spróbować z wersjami rozwojowymi (git, svn, bzr itp.), albo udać się na stronę programu, gdzie być może uzyskamy jakieś informacje. Po ewentualnym dostosowaniu PKGBUILDu wydajemy polecenie:
makepkg -si
To oczywiście pewien schemat działania. Nie zawsze pomoże. Nie jest nawet w 100% polecany (albowiem niekiedy programy są przeznaczone do pracy z określonymi wyłącznie bibliotekami). Jeśli się powiodło - fajnie. Jeśli nie - trzeba szukać jakiegoś innego rozwiązania.