it-swarm.com.de

Linux-Fehler beim Laden von gemeinsam genutzten Bibliotheken: Gemeinsame Objektdatei kann nicht geöffnet werden: Keine solche Datei oder Verzeichnis

Das Programm ist Teil der Xenomai-Testsuite, die von Linux-PCs in die Toolkette Linux + Xenomai ARM crosskompiliert wurde.

# 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                                 

Edit: OK Ich habe nicht bemerkt, dass .1 am Ende Teil des Dateinamens war. Was heißt das überhaupt?

270
zaratustra

Update
Das, was ich unten schreibe, gilt zwar als allgemeine Antwort zu gemeinsam genutzten Bibliotheken, aber ich denke, dass die häufigste Ursache für diese Art von Nachrichten darin liegt, dass Sie ein Paket installiert haben, die "-dev" -Version dieses Pakets jedoch nicht . 


Nun, es lügt nicht - es gibt keinen libpthread_rt.so.1 in dieser Liste. Sie müssen es wahrscheinlich neu konfigurieren und neu erstellen, so dass es von der vorhandenen Bibliothek abhängig ist, oder Sie installieren, was libpthread_rt.so.1 bereitstellt.

Im Allgemeinen sind die Nummern hinter dem .so Versionsnummern, und Sie werden oft feststellen, dass es sich um symbolische Verknüpfungen handelt. Wenn Sie also Version 1.1 von libfoo.so haben, haben Sie eine echte Datei libfoo.so.1.0. und symbolische Links foo.so und foo.so.1, die auf libfoo.so.1.0 verweisen. Wenn Sie Version 1.1 installieren, ohne die andere zu entfernen, haben Sie eine libfoo.so.1.1, und libfoo.so.1 und libfoo.so zeigen jetzt auf die neue, aber jeder Code, der genau diese Version erfordert, kann dies Verwenden Sie die Datei libfoo.so.1.0. Code, der nur auf der API der Version 1 basiert, sich aber nicht darum kümmert, ob 1.0 oder 1.1 libfoo.so.1 angeben. Wie orip in den Kommentaren darauf hingewiesen hat, wird dies unter http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html gut erklärt.

In Ihrem Fall kommen Sie möglicherweise mit dem symbolischen Link libpthread_rt.so.1 zu libpthread_rt.so. Es kann jedoch nicht garantiert werden, dass Ihr Code nicht beschädigt wird und Sie Ihre TV-Abendessen nicht essen.

116
Paul Tomblin

Ihre Bibliothek ist eine dynamische Bibliothek. Sie müssen dem Betriebssystem mitteilen, wo es zur Laufzeit lokalisiert werden kann.

Um dies zu tun, müssen wir die folgenden einfachen Schritte ausführen:

(1) Finden Sie heraus, wo sich die Bibliothek befindet, wenn Sie sie nicht kennen.

Sudo find / -name the_name_of_the_file.so

(2) Überprüfen Sie, ob die Umgebungsvariable für den dynamischen Bibliothekspfad vorhanden ist (LD_LIBRARY_PATH).

$ echo $LD_LIBRARY_PATH

wenn nichts angezeigt werden soll, fügen Sie einen Standardpfadwert hinzu (oder nicht, wenn Sie möchten)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Wir fügen den Wunschpfad hinzu, exportieren ihn und probieren die Anwendung aus.

Beachten Sie, dass der Pfad das Verzeichnis sein sollte, in dem sich path.so.something befindet ..__ Wenn also path.so.something in /my_library/path.so.something ist, sollte es Folgendes sein:

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

source: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html

247
XOR

Hier sind ein paar Lösungen, die Sie ausprobieren können:

ldconfig

AbiusX wies darauf hin: Wenn Sie die Bibliothek gerade erst installiert haben, müssen Sie möglicherweise einfach ldconfig ausführen.

Sudo ldconfig

ldconfig erstellt die erforderlichen Links und den Cache zum aktuellsten gemeinsam genutzte Bibliotheken in den Verzeichnissen gefunden, die im Befehl .__ angegeben sind. Zeile, in der Datei /etc/ld.so.conf und in den vertrauenswürdigen Verzeichnissen (/ lib und/usr/lib).

Normalerweise kümmert sich Ihr Paket-Manager darum, wenn Sie eine neue Bibliothek installieren, aber nicht immer, und es wird nicht schaden, ldconfig auszuführen, auch wenn dies nicht Ihr Problem ist.

Entwicklerpaket oder falsche Version

Wenn das nicht klappt, würde ich auch Pauls Vorschlag nachsehen und nach einer "-dev" -Version der Bibliothek suchen. Viele Bibliotheken sind in dev- und non-dev-Pakete aufgeteilt. Sie können diesen Befehl verwenden, um danach zu suchen:

apt-cache search <libraryname>

Dies kann auch hilfreich sein, wenn Sie einfach die falsche Version der Bibliothek installiert haben. Einige Bibliotheken werden gleichzeitig in verschiedenen Versionen veröffentlicht, z. B. Python.

Bibliotheksstandort

Wenn Sie sicher sind, dass das richtige Paket installiert ist und ldconfig es nicht gefunden hat, befindet es sich möglicherweise nur in einem nicht standardmäßigen Verzeichnis. Standardmäßig sucht ldconfig in /lib, /usr/lib und in /etc/ld.so.conf und $LD_LIBRARY_PATH aufgelisteten Verzeichnissen. Wenn sich Ihre Bibliothek an einem anderen Ort befindet, können Sie das Verzeichnis entweder in einer eigenen Zeile in /etc/ld.so.conf hinzufügen, den Pfad der Bibliothek an $LD_LIBRARY_PATH anhängen oder die Bibliothek in /usr/lib verschieben. Führen Sie dann ldconfig aus.

Um herauszufinden, wo sich die Bibliothek befindet, versuchen Sie Folgendes:

Sudo find / -iname *libraryname*.so*

(Ersetzen Sie libraryname durch den Namen Ihrer Bibliothek.)

Wenn Sie die $LD_LIBRARY_PATH-Route wählen, sollten Sie diese in Ihre ~/.bashrc-Datei einfügen, damit sie bei jeder Anmeldung ausgeführt wird:

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

Ich hatte den ähnlichen Fehler, ich konnte ihn durch Geben lösen, 

Sudo ldconfig -v

Hoffe das hilft. 

47
Bithin Alangot

Sie müssen sicherstellen, dass Sie den Bibliothekspfad während der -Verknüpfung angeben, wenn Sie Ihre .c-Datei kompilieren:

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

Der -Wl, -R-Teil teilt der resultierenden Binärdatei mit, dass sie zur Laufzeit auch nach libraryin/usr/local/lib suchen muss, bevor sie die in/usr/lib/verwendet.

Ich hoffe es wird dir helfen.

18
TaoCHEN92

Die linux.org-Referenzseite erklärt die Mechanik, erklärt jedoch nicht die Motivation dahinter :-(

Siehe dazu Sun Linker and Libraries Guide .

Beachten Sie außerdem, dass "externe Versionierung" unter Linux weitgehend veraltet ist, da die Symbolversionierung (Erweiterung GNU) es Ihnen ermöglicht, dass mehrere inkompatible Versionen derselben Funktion in einer einzigen Bibliothek vorhanden sind. Diese Erweiterung ermöglichte, dass glibc in den letzten 10 Jahren dieselbe externe Version hatte: libc.so.6.

12

Fügen Sie der LD_LIBRARY_PATH-Datei ~/.bashrc hinzu, die Suchpfade angibt

LD_LIBRARY_PATH=path_to_your_library

Es klappt!

10
Ankit Marothi
cd /home/<user_name>/
Sudo vi .bash_profile

fügen Sie diese Zeilen am Ende hinzu

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

Eine andere mögliche Lösung, abhängig von Ihrer Situation.

Wenn Sie wissen, dass libpthread_rt.so.1 mit libpthread_rt.so identisch ist, können Sie einen Symlink erstellen, indem Sie:

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

Dann sollte ls -l /lib nun den Symlink anzeigen und worauf er verweist.

4
ALM865

Wenn Sie Ihre Anwendung unter Microsoft Windows ausführen, muss der Pfad zu dynamischen Bibliotheken (.dll) in der Umgebungsvariablen PATH definiert werden.

Wenn Sie Ihre Anwendung unter UNIX ausführen, muss der Pfad zu Ihren dynamischen Bibliotheken (.so) in der Umgebungsvariablen LD_LIBRARY_PATH definiert werden.

2
Rubens Gomes

Alles was ich tun musste, war zu laufen:

Sudo apt-get install libfontconfig1

Ich befand mich in dem Ordner /usr/lib/x86_64-linux-gnu und es hat perfekt funktioniert.

2
jonny

Beim Ausführen meiner Anwendung mit Eclipse CDT unter Linux x86 trat dieser Fehler auf.
Um dies zu beheben:

  1. In Eclipse:

    Ausführen als -> Konfigurationen ausführen -> Umgebung

  2. Legen Sie den Pfad fest

    LD_LIBRARY_PATH=/my_lib_directory_path
    
2
Michael Fayad

Ich hatte einen ähnlichen Fehler und der Fehler wurde nicht behoben, indem LD_LIBRARY_PATH in ~/.bashrc ..__ angegeben wurde. Mein Problem wurde gelöst, indem die .conf-Datei hinzugefügt und geladen wurde .

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

Fügen Sie in dieser Datei Ihren Bibliothekspfad hinzu und speichern Sie die Datei (zB: /usr/local/lib).Sie müssen den folgenden Befehl ausführen, um den Pfad zu aktivieren:

ldconfig

Überprüfen Sie Ihren neuen Bibliothekspfad:

ldconfig -v | less

Wenn dies Ihre Bibliotheksdateien anzeigt, können Sie loslegen.

2
Anand Paul

versuchen Sie, Sudo lib32z1 zu installieren

Sudo apt-get install lib32z1

2
zajac.m2

Der Fehler tritt auf, da das System nicht auf die erwähnte Bibliotheksdatei verweisen kann. Führen Sie die folgenden Schritte aus:

  1. Wenn Sie locate libpthread_rt.so.1 ausführen, wird der Pfad aller Dateien mit diesem Namen aufgelistet. Nehmen wir an, ein Pfad ist /home/user/loc.
  2. Kopieren Sie den Pfad und führen Sie cd home/USERNAME aus. Ersetzen Sie USERNAME durch den Namen des aktuell aktiven Benutzers, mit dem Sie die Datei ausführen möchten.
  3. Führen Sie vi .bash_profile aus und fügen Sie am Ende des LD_LIBRARY_PATH-Parameters kurz vor . die Zeile /lib://home/usr/loc:. hinzu. Speicher die Datei.
  4. Schließen Sie das Terminal und starten Sie die Anwendung erneut. Es sollte laufen.
1
vipin nair

ein ähnliches Problem wurde hier gefunden: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 Ich habe die erwähnte Lösung ausprobiert und sie funktioniert tatsächlich.

Die Lösungen in den vorherigen Fragen funktionieren möglicherweise. Aber ich denke, das ist eine einfache Möglichkeit, das Problem zu beheben. Versuchen Sie, das Paket libwbclient in Fedora neu zu installieren:

dnf reinstall libwbclient
0

Ich habe diesen Fehler erhalten und denke, es ist der gleiche Grund von Ihnen

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

Versuche dies. Berechtigungen korrigieren für Dateien:

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

"Sudo su", um Berechtigungen für Ihr Dateisystem zu erhalten.

0
Mohamad Osama

Ich habe diesen Fehler erhalten und denke, es ist der gleiche Grund von Ihnen

fehler beim Laden von gemeinsam genutzten Bibliotheken: libnw.so: freigegebene .__ kann nicht geöffnet werden. Objektdatei: Keine solche Datei oder Verzeichnis

Versuche dies. Berechtigungen für Dateien korrigieren:

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