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?
linux
shared-libraries
file-not-found
xenomai
zaratustra
źródło
źródło
Odpowiedzi:
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.1
na 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ępnialibpthread_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.1
dolibpthread_rt.so
. Nie ma jednak gwarancji, że nie złamie twojego kodu i nie zje obiadów telewizyjnych.źródło
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.
(2) Sprawdź, czy istnieje zmienna środowiskowa dynamicznej ścieżki biblioteki (
LD_LIBRARY_PATH
)jeśli nie ma nic do wyświetlenia, dodaj domyślną wartość ścieżki (lub nie, jeśli chcesz)
(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.something
znajduje. Więc jeślipath.so.something
jest w/my_library/path.so.something
nim, powinno być:źródło: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
źródło
find
samodzielnie:find / -name the_name_of_the_file.so
LD_LIBRARY_PATH
powinien wskazywać na katalog zawierającypath.so.something
, a nie napath.so.something
siebie.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 .
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ć:
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/lib
i katalogi wymienione w/etc/ld.so.conf
i$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_PATH
biblioteki lub przenieść bibliotekę/usr/lib
. Potem biegnijldconfig
.Aby dowiedzieć się, gdzie jest biblioteka, spróbuj tego:
(Zamień
libraryname
na nazwę swojej biblioteki)Jeśli wybierzesz
$LD_LIBRARY_PATH
trasę, zechcesz umieścić ją w swoim~/.bashrc
pliku, aby był uruchamiany przy każdym logowaniu:źródło
.conf
wł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ę.Miałem podobny błąd, mogłem go rozwiązać, podając,
Mam nadzieję że to pomoże.
źródło
Musisz upewnić się, że określasz ścieżkę biblioteki podczas łączenia podczas kompilacji pliku .c:
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.
źródło
-Wl,-rpath DIR
.Spróbuj dodać plik
LD_LIBRARY_PATH
, który wskazuje ścieżki wyszukiwania~/.bashrc
To działa!
źródło
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.6
przez ostatnie 10 lat.źródło
dodaj te linie na końcu
źródło
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.
Dodaj ścieżkę do biblioteki w tym pliku i zapisz. (Np .: / usr / local / lib). Musisz uruchomić następujące polecenie, aby aktywować ścieżkę:
Sprawdź swoją nową ścieżkę do biblioteki:
Jeśli pokazuje to twoje pliki bibliotek, możesz zacząć.
źródło
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:
Następnie
ls -l /lib
powinien teraz pokazać dowiązanie symboliczne i to, na co wskazuje.źródło
Wystąpił ten błąd podczas uruchamiania aplikacji za pomocą Eclipse CDT w systemie Linux x86.
Aby to naprawić:
Ustaw ścieżkę
źródło
Wszystko, co musiałem zrobić, to uruchomić:
Byłem w folderze znajdującym się pod
/usr/lib/x86_64-linux-gnu
i działało idealnie.źródło
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.
źródło
spróbuj zainstalować sudo lib32z1
źródło
Błąd występuje, ponieważ system nie może odwoływać się do wspomnianego pliku biblioteki. Wykonaj następujące kroki:
locate libpthread_rt.so.1
wyświetli ścieżkę do wszystkich plików o tej nazwie. Załóżmy, że ścieżka jest/home/user/loc
.cd home/USERNAME
. Zamień USERNAME na nazwę bieżącego aktywnego użytkownika, z którym chcesz uruchomić plik.vi .bash_profile
i na końcuLD_LIBRARY_PATH
parametru, tuż przed.
, dodaj linię/lib://home/usr/loc:.
. Zapisz plik.źródło
Wystąpił ten błąd i myślę, że to ten sam powód
Spróbuj tego. Napraw uprawnienia do plików:
„Sudo su”, aby uzyskać uprawnienia do systemu plików.
źródło
Wystąpił ten błąd i myślę, że to ten sam powód
Spróbuj tego. Napraw uprawnienia do plików:
źródło
podobny problem znaleziono tutaj: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 Wypróbowałem wspomniane rozwiązanie i faktycznie działa.
Rozwiązania z poprzednich pytań mogą działać. Ale myślę, że to łatwy sposób, aby to naprawić. Spróbuj ponownie zainstalować pakiet
libwbclient
w Fedorze:źródło
Używam Ubuntu 18.04
Instalacja odpowiedniego pakietu „-dev” działała dla mnie,
Otrzymałem następujący błąd, dopóki nie zainstalowałem powyższego pakietu,
źródło