Czy jest w porządku (czy nie) bibliotekowanie dowiązań symbolicznych w celu przezwyciężenia błędów „nie można otworzyć obiektu udostępnionego”?

12

Czasami z tego czy innego powodu program nie określił poprawnie lub nie uwzględnił wszystkich swoich zależności, a uruchomienie go powoduje błędy wskazujące na brakujące zależności. Typowy błąd to coś takiego:

cannot open shared object libudev.so.0

Widzę wiele odpowiedzi doradzających ludziom obejście takich problemów poprzez tworzenie dowiązań symbolicznych w /usr/libinnych lokalizacjach systemu, co często wydaje się rozwiązać problem. Ale widzę tyle samo komentarzy, które doradzają ludziom, że to zły pomysł. Oto jedna reprezentatywna odpowiedź.

W jakich okolicznościach dopuszczalne jest symlinkowanie biblioteki, aby program działał? Nigdy? Czasami? Co się stanie, jeśli usuniesz dowiązanie symboliczne po zakończeniu uruchamiania programu?

Jakie są konsekwencje zrobienia tego?

John Feminella
źródło

Odpowiedzi:

12

Problem z tworzeniem tych linków polega na tym, że nie są zarządzane w żaden znaczący sposób. Jeśli ta biblioteka zostanie usunięta, łącze zostanie zerwane. Jeśli biblioteka zostanie zaktualizowana, może wystąpić błąd z powodu łącza, którego nie spodziewa się tam znaleźć.

Poza tym w zasadzie kłamiesz systemowi. W połączonym przykładzie udajesz, że tak libudev.so.1jest libudev.so.0. Z różnych powodów są nazywane inaczej (różne wersje biblioteki). Chociaż może to działać dobrze w przypadku niektórych programów, istnieje możliwość, że różnice między wersjami mogą powodować problemy (takie jak awaria lub inne nieoczekiwane zachowanie).

Więc jeśli tworzysz ten link tylko po to, aby uruchomić program i wiesz, że usuniesz go później, rozwiązujesz pierwszy problem, ale nie drugi. Chociaż dotyczy to podstawowej kwestii, nie jest idealne.

Idealnym rozwiązaniem jest oczywiście zainstalowanie odpowiedniej wersji biblioteki (zaakceptowana odpowiedź na podanym linku) lub skompilowanie programu z posiadaną wersją.

Nattgew
źródło