Błąd systemu Linux podczas ładowania bibliotek współdzielonych: nie można otworzyć pliku obiektu współdzielonego: brak takiego pliku lub katalogu


356

Program jest częścią pakietu testowego Xenomai, skompilowanego krzyżowo z Linux PC na Linux + Xenomai ARM toolchain.

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 

Edycja: OK Nie zauważyłem, że .1 na końcu było częścią nazwy pliku. Co to w ogóle znaczy?


277
Może się to zdarzyć, jeśli niedawno zainstalowałeś bibliotekę współdzieloną i później nie uruchomiłeś ldconfig (8). Wykonaj „ldconfig”, nie ma w tym żadnej szkody.
AbiusX

25
+1 do komentarza @AbiusX - uruchamianie sudo ldconfig (przy założeniu, że biblioteki są tam, gdzie powinny być [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / and / usr / local / include / AFAIK], popraw mnie, jeśli się mylę) może rozwiązać ten problem. Twoje zdrowie!
AeroCross

Zauważ, że ten błąd może również wystąpić, jeśli uprawnienia do pliku lib zostały w jakiś sposób zmienione. Zmiana uprawnień z powrotem na 644 rozwiązała to dla mnie.
Geoffrey H

Odpowiedzi:


139

Aktualizacja
Chociaż to, co piszę poniżej, jest prawdą jako ogólna odpowiedź na temat bibliotek współdzielonych, myślę, że najczęstszą przyczyną tego rodzaju wiadomości jest to, że zainstalowałeś pakiet, ale nie zainstalowałeś wersji „-dev” tego pakietu.


Cóż, to nie kłamstwo - nie ma go libpthread_rt.so.1na tej liście. Prawdopodobnie konieczna będzie ponowna konfiguracja i ponowna kompilacja, tak aby zależało to od posiadanej biblioteki lub zainstalowania tego, co udostępnia libpthread_rt.so.1.

Zasadniczo liczby po .so są numerami wersji i często okaże się, że są to dowiązania symboliczne, więc jeśli masz wersję 1.1 libfoo.so, będziesz mieć prawdziwy plik libfoo.so.1.0, i dowiązania symboliczne foo.so i foo.so.1 wskazujące na libfoo.so.1.0. A jeśli zainstalujesz wersję 1.1 bez usuwania drugiej, będziesz mieć libfoo.so.1.1, a libfoo.so.1 i libfoo.so będą teraz wskazywać na nowy, ale każdy kod, który wymaga tej dokładnej wersji, może użyj pliku libfoo.so.1.0. Kod, który opiera się tylko na interfejsie API wersji 1, ale nie obchodzi go, czy to 1.0, czy 1.1, określa libfoo.so.1. Jak zauważył orip w komentarzach, wyjaśniono to dobrze na stronie http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html .

W twoim przypadku, to może uciec z symlinking libpthread_rt.so.1do libpthread_rt.so. Nie ma jednak gwarancji, że nie złamie twojego kodu i nie zje obiadów telewizyjnych.


5
... o Boże, .1 jest częścią nazwy pliku. Masz pojęcie, co to znaczy?
zaratustra

orip zasługuje na +1 dla tego linku. Jeśli nie masz nic przeciwko, @orip, chciałbym umieścić twój link w odpowiedzi?
Paul Tomblin

@PaulTomblin, otrzymuję podobny błąd podczas naprawy gruba. Czy możesz mi w tym pomóc? To pytanie -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@TomNysetvold i Paul, tak - to ten sam dokument.
orip

W poszukiwaniu tej odpowiedzi natknąłem się na wiele złych informacji i rozwiązań dotyczących ronda. Coś we mnie kazało mi szukać, dopóki nie znajdę rozwiązania z jednym poleceniem.
c ..

326

Twoja biblioteka jest biblioteką dynamiczną. Musisz powiedzieć systemowi operacyjnemu, gdzie może go zlokalizować w czasie wykonywania.

Aby to zrobić, musimy wykonać te proste kroki:

(1) Znajdź, gdzie znajduje się biblioteka, jeśli jej nie znasz.

sudo find / -name the_name_of_the_file.so

(2) Sprawdź, czy istnieje zmienna środowiskowa dynamicznej ścieżki biblioteki ( LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

jeśli nie ma nic do wyświetlenia, dodaj domyślną wartość ścieżki (lub nie, jeśli chcesz)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Dodajemy ścieżkę pożądania, eksportujemy ją i wypróbowujemy aplikację.

Zauważ, że ścieżka powinna być katalogiem, w którym się path.so.somethingznajduje. Więc jeśli path.so.somethingjest w /my_library/path.so.somethingnim, powinno być:

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

źródło: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html


3
Powyższa odpowiedź była bardzo jasna, przede wszystkim dziękuję. Próbowałem to zrobić w ścieżce projektu Eclipse CDT Project (Lubuntu). / Debuguj $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" tutaj moje biblioteki są nawet dostępne, ale wciąż pojawia się ten sam błąd. Jakieś sugestie!
nahasapeemapetilon

12
Wypróbuj polecenie „ldconfig” po wyeksportowaniu biblioteki. Może być konieczne wykonanie tego polecenia jako „sudo”.
XOR

5
Wszystkie polecenia w kroku (1) można wykonać findsamodzielnie:find / -name the_name_of_the_file.so
wbadart

3
Uważam, że LD_LIBRARY_PATHpowinien wskazywać na katalog zawierający path.so.something, a nie na path.so.somethingsiebie.
gerrit

2
Przestrzeganie twoich poleceń krok po kroku rozwiązało mój problem! Wielkie dzięki!
Fisher Coder,

156

Oto kilka rozwiązań, które możesz wypróbować:

ldconfig

Jak wskazał AbiusX: Jeśli właśnie zainstalowałeś bibliotekę, być może będziesz musiał po prostu uruchomić ldconfig .

sudo ldconfig

ldconfig tworzy niezbędne łącza i pamięć podręczną do najnowszych bibliotek współdzielonych znalezionych w katalogach określonych w wierszu poleceń, w pliku /etc/ld.so.conf oraz w zaufanych katalogach (/ lib i / usr / lib).

Zwykle menedżer pakietów zajmie się tym podczas instalowania nowej biblioteki, ale nie zawsze, i nie zaszkodzi uruchomić ldconfig, nawet jeśli nie jest to twój problem.

Pakiet deweloperski lub zła wersja

Jeśli to nie zadziała, sprawdziłbym również sugestię Paula i poszukał „-dev” wersji biblioteki. Wiele bibliotek jest podzielonych na pakiety programistyczne i inne. Możesz użyć tego polecenia, aby go wyszukać:

apt-cache search <libraryname>

Może to również pomóc, jeśli po prostu masz zainstalowaną niewłaściwą wersję biblioteki. Niektóre biblioteki są publikowane jednocześnie w różnych wersjach, na przykład Python.

Lokalizacja biblioteki

Jeśli masz pewność, że odpowiedni pakiet został zainstalowany, a ldconfig go nie znalazł, może on znajdować się w niestandardowym katalogu. Domyślnie ldconfig wygląda w /lib, /usr/libi katalogi wymienione w /etc/ld.so.confi $LD_LIBRARY_PATH. Jeśli twoja biblioteka jest gdzieś indziej, możesz dodać katalog do własnego wiersza /etc/ld.so.conf, dołączyć ścieżkę do $LD_LIBRARY_PATHbiblioteki lub przenieść bibliotekę /usr/lib. Potem biegnij ldconfig.

Aby dowiedzieć się, gdzie jest biblioteka, spróbuj tego:

sudo find / -iname *libraryname*.so*

(Zamień librarynamena nazwę swojej biblioteki)

Jeśli wybierzesz $LD_LIBRARY_PATHtrasę, zechcesz umieścić ją w swoim ~/.bashrcpliku, aby był uruchamiany przy każdym logowaniu:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library

3
Domyślnie / lib i / usr / lib, ale nie / usr / local / lib? To rzuciło mnie kilka razy w ciągu mojej kariery i zmarnowałem godziny.
DarenW,

@DarenW Dla mnie działa z / usr / local / lib. Ubuntu 14.04 LTS.
gon1332

Dodanie .confwłasnych plików z niestandardowymi ścieżkami lib, które muszę /etc/ld.so.conf.d(wskazane przez /etc/ld.so.conf), załatwiło sprawę.
CivFan

4
+1 za konieczność uruchomienia ldconfig. Nie korzystałem z menedżera pakietów. Musiałem skompilować ze źródła, więc było to konieczne.
Jeff

7
to jest prawdziwa odpowiedź
Scott Stensland

53

Miałem podobny błąd, mogłem go rozwiązać, podając,

sudo ldconfig -v

Mam nadzieję że to pomoże.


37
Cześć, to może rozwiązać problem ... ale byłoby dobrze, gdybyś mógł edytować swoją odpowiedź i podać krótkie wyjaśnienie, w jaki sposób i dlaczego to działa :) Nie zapominaj - na przepełnieniu stosu jest mnóstwo nowych graczy, i mogą nauczyć się czegoś z twojej wiedzy - to, co dla ciebie oczywiste, może nie być dla nich takie.
Taryn East

Nie będzie w stanie tego wyjaśnić. Właśnie skopiował swoją odpowiedź.
Jhourlad Estrella

duplikat odpowiedzi ... patrz ta sama odpowiedź powyżej, spreparowana dzień wcześniej
Scott Stensland,

25

Musisz upewnić się, że określasz ścieżkę biblioteki podczas łączenia podczas kompilacji pliku .c:

gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

Część -Wl, -R mówi wynikowemu plikowi binarnemu, aby szukał również biblioteki w / usr / local / lib w czasie wykonywania, zanim spróbuje użyć tej w / usr / lib /

Mam nadzieję, że ci to pomoże.


3
To była opcja, której szukałem. Być może lepiej byłoby -Wl,-rpath DIR.
jrw32982 obsługuje Monikę

1
świetny! Napotkałem ten problem, gdy mój program pomyślnie skompilował się z cmake, ale nie mógł się uruchomić z powodu błędu. Ta odpowiedź rozwiązała mój problem
Ivan Talalaev

15

Spróbuj dodać plik LD_LIBRARY_PATH, który wskazuje ścieżki wyszukiwania~/.bashrc

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

To działa!


13

Strona referencyjna linux.org wyjaśnia mechanikę, ale nie wyjaśnia motywacji :-(

Aby to zrobić , zobacz Sun Linker i przewodnik po bibliotekach

Ponadto zauważ, że „zewnętrzna wersja” jest w dużej mierze przestarzała w Linuksie, ponieważ wersjonowanie symboli (rozszerzenie GNU) pozwala na posiadanie wielu niekompatybilnych wersji tej samej funkcji, które mogą być obecne w jednej bibliotece. To rozszerzenie pozwoliło glibc mieć tę samą wersję zewnętrzną: libc.so.6przez ostatnie 10 lat.


7
cd /home/<user_name>/
sudo vi .bash_profile

dodaj te linie na końcu

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

5

Miałem podobny błąd i nie naprawiłem się, podając LD_LIBRARY_PATH w ~ / .bashrc. Rozwiązałem mój problem, dodając plik .conf i ładując go. Idź do terminalu i bądź w su.

gedit /etc/ld.so.conf.d/myapp.conf

Dodaj ścieżkę do biblioteki w tym pliku i zapisz. (Np .: / usr / local / lib). Musisz uruchomić następujące polecenie, aby aktywować ścieżkę:

ldconfig

Sprawdź swoją nową ścieżkę do biblioteki:

ldconfig -v | less

Jeśli pokazuje to twoje pliki bibliotek, możesz zacząć.


4

Inne możliwe rozwiązanie w zależności od twojej sytuacji.

Jeśli wiesz, że libpthread_rt.so.1 jest taki sam jak libpthread_rt.so, możesz utworzyć dowiązanie symboliczne poprzez:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

Następnie ls -l /libpowinien teraz pokazać dowiązanie symboliczne i to, na co wskazuje.


4

Wystąpił ten błąd podczas uruchamiania aplikacji za pomocą Eclipse CDT w systemie Linux x86.
Aby to naprawić:

  1. W środowisku Eclipse:

    Uruchom jako -> Uruchom konfiguracje -> Środowisko

  2. Ustaw ścieżkę

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

Wszystko, co musiałem zrobić, to uruchomić:

sudo apt-get install libfontconfig1

Byłem w folderze znajdującym się pod /usr/lib/x86_64-linux-gnui działało idealnie.


2

Jeśli aplikacja jest uruchomiona w systemie Microsoft Windows, ścieżkę do bibliotek dynamicznych (.dll) należy zdefiniować w zmiennej środowiskowej PATH.

Jeśli aplikacja jest uruchomiona w systemie UNIX, ścieżkę do bibliotek dynamicznych (.so) należy zdefiniować w zmiennej środowiskowej LD_LIBRARY_PATH.



1

Błąd występuje, ponieważ system nie może odwoływać się do wspomnianego pliku biblioteki. Wykonaj następujące kroki:

  1. Uruchomiony locate libpthread_rt.so.1wyświetli ścieżkę do wszystkich plików o tej nazwie. Załóżmy, że ścieżka jest /home/user/loc.
  2. Skopiuj ścieżkę i uruchom cd home/USERNAME. Zamień USERNAME na nazwę bieżącego aktywnego użytkownika, z którym chcesz uruchomić plik.
  3. Uruchom vi .bash_profilei na końcu LD_LIBRARY_PATHparametru, tuż przed ., dodaj linię /lib://home/usr/loc:.. Zapisz plik.
  4. Zamknij terminal i uruchom ponownie aplikację. Powinien biec.

0

Wystąpił ten błąd i myślę, że to ten sam powód

error while loading shared libraries: libnw.so: cannot open shared object 
file: No such file or directory

Spróbuj tego. Napraw uprawnienia do plików:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

„Sudo su”, aby uzyskać uprawnienia do systemu plików.


0

Wystąpił ten błąd i myślę, że to ten sam powód

błąd podczas ładowania bibliotek współdzielonych: libnw.so: nie można otworzyć pliku obiektu współdzielonego: brak takiego pliku lub katalogu

Spróbuj tego. Napraw uprawnienia do plików:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 


0

Używam Ubuntu 18.04

Instalacja odpowiedniego pakietu „-dev” działała dla mnie,

sudo apt install libgconf2-dev

Otrzymałem następujący błąd, dopóki nie zainstalowałem powyższego pakietu,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.