Errore Linux durante il caricamento di librerie condivise: impossibile aprire il file oggetto condiviso: nessun file o directory


356

Il programma fa parte della suite di test Xenomai, compilata in modo incrociato da PC Linux in toolchain ARM Linux + Xenomai.

# 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                                 

Modifica: OK Non ho notato che .1 alla fine faceva parte del nome del file. Che cosa significa comunque?


277
Ciò potrebbe accadere se hai installato di recente una libreria condivisa e successivamente non hai eseguito ldconfig (8). Fai 'ldconfig', non c'è nulla di male in esso.
AbiusX,

25
Da +1 a @AbiusX comment - eseguendo sudo ldconfig (supponendo che le librerie siano in realtà dove dovrebbero essere [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / e / usr / local / include / AFAIK], per favore correggimi se sbaglio) puoi risolvere quel problema. Saluti!
AeroCross

Si noti che questo errore può verificarsi anche se le autorizzazioni sul file lib sono state modificate in qualche modo. La modifica delle autorizzazioni su 644 ha risolto il problema per me.
Geoffrey H,

Risposte:


140

Aggiornamento
Mentre quello che scrivo di seguito è vero come una risposta generale sulle librerie condivise, penso che la causa più frequente di questo tipo di messaggi sia perché hai installato un pacchetto, ma non hai installato la versione "-dev" di quel pacchetto.


Bene, non sta mentendo - non c'è nessun libpthread_rt.so.1in quella lista. Probabilmente dovrai riconfigurarlo e ricostruirlo in modo che dipenda dalla libreria che hai o installare qualsiasi cosa fornisca libpthread_rt.so.1.

Generalmente, i numeri dopo il .so sono numeri di versione e spesso troverai che sono collegamenti simbolici tra loro, quindi se hai la versione 1.1 di libfoo.so, avrai un vero file libfoo.so.1.0, e collegamenti simbolici foo.so e foo.so.1 che puntano a libfoo.so.1.0. E se installi la versione 1.1 senza rimuovere l'altra, avrai un libfoo.so.1.1 e libfoo.so.1 e libfoo.so indicheranno ora quello nuovo, ma qualsiasi codice che richiede quella versione esatta può usa il file libfoo.so.1.0. Il codice che si basa solo sull'API versione 1, ma non importa se è 1.0 o 1.1 specificherà libfoo.so.1. Come ha sottolineato orip nei commenti, questo è spiegato bene su http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html .

Nel tuo caso, si potrebbe farla franca con un collegamento simbolico libpthread_rt.so.1a libpthread_rt.so. Tuttavia, non garantiamo che non infrangerà il tuo codice e non mangerà le tue cene TV.


5
... oh dio, il .1 fa parte del nome del file. Qualche idea su cosa significhi?
Zaratustra,

orip merita un +1 per quel link. Se non ti dispiace, @orip, vorrei inserire il tuo link nella risposta?
Paul Tomblin,

@PaulTomblin, ricevo un errore simile durante la riparazione di grub. Mi potete aiutare su questo? Questa domanda -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@ TomNysetvold e Paul, sì, è lo stesso documento.
orip,

Mi sono imbattuto in molte informazioni sbagliate e soluzioni rotatorie nella mia ricerca di questa risposta. Qualcosa dentro di me mi ha detto di continuare a cercare fino a quando non ho trovato una soluzione a comando singolo.
c ..

327

La tua libreria è una libreria dinamica. Devi dire al sistema operativo dove può trovarlo in fase di esecuzione.

Per fare ciò, dovremo fare questi semplici passaggi:

(1) Trova dove si trova la libreria se non la conosci.

sudo find / -name the_name_of_the_file.so

(2) Verifica l'esistenza della variabile di ambiente del percorso della libreria dinamica ( LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

se non c'è nulla da visualizzare, aggiungi un valore di percorso predefinito (o no se lo desideri)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Aggiungiamo il percorso del desiderio, lo esportiamo e proviamo l'applicazione.

Si noti che il percorso dovrebbe essere la directory in cui si path.so.somethingtrova. Quindi se path.so.somethingè dentro /my_library/path.so.somethingdovrebbe essere:

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

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


3
La risposta sopra menzionata è stata molto chiara, grazie innanzitutto. Ho provato a farlo nel mio Eclipse CDT Project Path (Lubuntu). / Debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" questo è dove le mie librerie sono effettivamente disponibili anche, ma continuo a ricevere lo stesso errore. Eventuali suggerimenti!
nahasapeemapetilon,

12
Prova un comando "ldconfig" dopo aver esportato la tua libreria. Potrebbe essere necessario eseguire questo comando come "sudo".
XOR,

5
Tutti i comandi nel passaggio (1) possono essere eseguiti da findsoli:find / -name the_name_of_the_file.so
wbadart

3
Credo che LD_LIBRARY_PATHdovrebbe puntare alla directory contenente path.so.something, non a path.so.somethingse stessa.
Gerrit,

2
Seguire i tuoi comandi passo dopo passo ha risolto il mio problema! Grazie mille!
Fisher Coder,

156

Ecco alcune soluzioni che puoi provare:

ldconfig

Come ha sottolineato AbiusX: se hai appena installato la libreria, potresti dover semplicemente eseguire ldconfig .

sudo ldconfig

ldconfig crea i collegamenti e la cache necessari alle più recenti librerie condivise trovate nelle directory specificate sulla riga comandi, nel file /etc/ld.so.conf e nelle directory attendibili (/ lib e / usr / lib).

Di solito il gestore dei pacchetti si occuperà di questo quando installi una nuova libreria, ma non sempre, e non farà male eseguire ldconfig anche se questo non è il tuo problema.

Pacchetto di sviluppo o versione errata

Se il problema persiste , verificherei anche il suggerimento di Paul e cercherei una versione "-dev" della libreria. Molte librerie sono divise in pacchetti dev e non-dev. Puoi usare questo comando per cercarlo:

apt-cache search <libraryname>

Questo può anche aiutare se hai semplicemente installato la versione sbagliata della libreria. Alcune librerie vengono pubblicate contemporaneamente in diverse versioni, ad esempio Python.

Ubicazione della biblioteca

Se sei sicuro che sia installato il pacchetto giusto e ldconfig non lo ha trovato, potrebbe trovarsi in una directory non standard. Per impostazione predefinita, ldconfig guarda in /lib, /usr/libe directory elencate nella /etc/ld.so.confe $LD_LIBRARY_PATH. Se la tua libreria si trova da qualche altra parte, puoi aggiungere la directory sulla sua stessa riga /etc/ld.so.conf, aggiungere il percorso della libreria $LD_LIBRARY_PATHo spostarla in /usr/lib. Quindi corri ldconfig.

Per scoprire dove si trova la libreria, prova questo:

sudo find / -iname *libraryname*.so*

(Sostituisci librarynamecon il nome della tua libreria)

Se segui il $LD_LIBRARY_PATHpercorso, ti consigliamo di inserirlo nel tuo ~/.bashrcfile in modo che venga eseguito ogni volta che accedi:

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

3
Per impostazione predefinita, / lib e / usr / lib ma non / usr / local / lib? Ciò mi ha respinto diverse volte durante la mia carriera e ha sprecato ore.
DarenW,

@DarenW Per me funziona con / usr / local / lib. Ubuntu 14.04 LTS.
gon1332,

Aggiungere i .confmiei file con i percorsi lib non standard di cui ho bisogno /etc/ld.so.conf.d(indicato da /etc/ld.so.conf) ha fatto il trucco.
CivFan,

4
+1 per la necessità di eseguire ldconfig. Non stavo usando un gestore di pacchetti. Ho dovuto compilare dalla fonte, quindi questo era necessario.
Jeff,

7
questa è la vera risposta
Scott Stensland,

53

Ho avuto l'errore simile, ho potuto risolverlo dando,

sudo ldconfig -v

Spero che sia di aiuto.


37
Ciao, questo potrebbe risolvere il problema ... ma sarebbe bene se tu potessi modificare la tua risposta e fornire una piccola spiegazione su come e perché funziona :) Non dimenticare: ci sono un sacco di principianti su Stack Overflow, e potrebbero imparare qualcosa o due dalla tua esperienza: ciò che è ovvio per te potrebbe non essere così per loro.
Taryn East,

Non sarà in grado di spiegarlo. Ha appena copiato la sua risposta.
Jhourlad Estrella,

risposta duplicata ... vedi la stessa risposta sopra realizzata il giorno prima
Scott Stensland

25

È necessario assicurarsi di specificare il percorso della libreria durante il collegamento quando si compila il file .c:

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

La parte -Wl, -R dice al binario risultante di cercare anche la libreria in / usr / local / lib in fase di esecuzione prima di provare a usare quella in / usr / lib /

Spero che ti possa aiutare.


3
Questa è l'opzione che stavo cercando. Forse sarebbe meglio -Wl,-rpath DIR.
jrw32982 supporta Monica

1
grande! Ho riscontrato questo problema quando il mio programma è stato compilato correttamente con cmake ma non è stato possibile avviarlo a causa di un errore. Questa risposta ha risolto il mio problema
Ivan Talalaev,

15

Prova ad aggiungere LD_LIBRARY_PATH, che indica i percorsi di ricerca, al tuo ~/.bashrcfile

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

Funziona!


13

La pagina di riferimento di linux.org spiega la meccanica, ma non spiega nessuna delle motivazioni dietro di essa :-(

Per questo, consultare Sun Linker e la guida alle librerie

Inoltre, si noti che il "versioning esterno" è in gran parte obsoleto su Linux, poiché il versioning dei simboli (un'estensione GNU) consente di avere più versioni incompatibili della stessa funzione per essere presenti in una singola libreria. Questa estensione ha permesso a glibc di avere la stessa versione esterna: libc.so.6negli ultimi 10 anni.


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

aggiungi queste righe alla fine

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

5

Ho avuto un errore simile e non è stato risolto dando LD_LIBRARY_PATH in ~ / .bashrc. Ciò che ha risolto il mio problema è aggiungendo il file .conf e caricandolo. Vai al terminal ed essere in su.

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

Aggiungi il percorso della tua libreria in questo file e salva. (Es: / usr / local / lib). È necessario eseguire il comando seguente per attivare il percorso:

ldconfig

Verifica il tuo nuovo percorso della libreria:

ldconfig -v | less

Se questo mostra i tuoi file di libreria, allora sei a posto.


4

Un'altra possibile soluzione a seconda della situazione.

Se sai che libpthread_rt.so.1 è uguale a libpthread_rt.so, puoi creare un link simbolico tramite:

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

Quindi ls -l /libdovrebbe ora mostrare il collegamento simbolico e ciò a cui punta.


4

Ho riscontrato questo errore durante l'esecuzione dell'applicazione con Eclipse CDT su Linux x86.
Per risolvere questo problema:

  1. In Eclipse:

    Esegui come -> Esegui configurazioni -> Ambiente

  2. Imposta il percorso

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

Tutto quello che dovevo fare era correre:

sudo apt-get install libfontconfig1

Ero nella cartella situata in /usr/lib/x86_64-linux-gnue ha funzionato perfettamente.


2

Se si esegue l'applicazione su Microsoft Windows, il percorso delle librerie dinamiche (.dll) deve essere definito nella variabile d'ambiente PATH.

Se si esegue l'applicazione su UNIX, il percorso delle librerie dinamiche (.so) deve essere definito nella variabile di ambiente LD_LIBRARY_PATH.


1

prova a installare sudo lib32z1

sudo apt-get install lib32z1


1

L'errore si verifica poiché il sistema non può fare riferimento al file della libreria menzionato. Procedi come segue:

  1. In esecuzione locate libpthread_rt.so.1elencherà il percorso di tutti i file con quel nome. Supponiamo che sia un percorso /home/user/loc.
  2. Copia il percorso ed esegui cd home/USERNAME. Sostituisci USERNAME con il nome dell'utente attivo corrente con cui desideri eseguire il file.
  3. Esegui vi .bash_profilee alla fine del LD_LIBRARY_PATHparametro, poco prima ., aggiungi la riga /lib://home/usr/loc:.. Salva il file.
  4. Chiudi il terminale e riavvia l'applicazione. Dovrebbe funzionare.

0

Ho avuto questo errore e penso che sia la tua stessa ragione

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

Prova questo. Correggi le autorizzazioni sui file:

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

"Sudo su" per ottenere i permessi sul tuo filesystem.


0

Ho avuto questo errore e penso che sia la tua stessa ragione

errore durante il caricamento delle librerie condivise: libnw.so: impossibile aprire il file oggetto condiviso: nessun file o directory

Prova questo. Correggi le autorizzazioni sui file:

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


0

Uso Ubuntu 18.04

L'installazione del pacchetto "-dev" corrispondente ha funzionato per me,

sudo apt install libgconf2-dev

Stavo ottenendo l'errore di seguito finché non ho installato il pacchetto sopra,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.