Quick Fix: error while loading shared libraries

Salve a tutti e ben tornati dalle vacanze!Per riprendere un po’ il ritmo con il blog vi propongo dei mini-post che rispondono velocemente ai più comuni problemi di compilazione ed esecuzione di programmi.

Il primo problema che risolveremo è il seguente

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

A chi non è capitato almeno una volta nella vita?

PREMESSA:

Ogni applicazione sul vostro sistema usa delle librerie. Una libreria non è altro che un insieme di codice già pronto e compilato che esegue delle funzioni specifiche. Questo permette ad ogni sviluppatore di non reinventare la ruota ogni volta ma di utilizzare il codice già scritto da altri.

Una libreria può essere statica (.a) o dinamica (.so o .dll su Windows). Nel primo caso la libreria viene inglobata nell’eseguibile in fase di compilazione, nel secondo invece la libreria è un file separato che viene agganciato all’eseguibile durante il caricamento del programma da un componente del sistema operativo chiamato linker dinamico.

Ovviamente le librerie dinamiche ottimizzano meglio le risorse evitando che del codice uguale venga replicato inutilmente in ogni eseguibile.

CAUSA:

Il messaggio di errore non lascia alcun dubbio: la libreria dinamica non è presente nel sistema o il linker dinamico non riesce a trovarla.

SOLUZIONE:

Se la causa è semplice la soluzione è altrettanto semplice.

Per prima cosa accertiamoci che la libreria sia installata e presente nel nostro sistema. Possiamo verificarlo agilmente con

locate libXXX.so

Che restituirà il percorso della libreria.

Se la libreria è stata installata durante la sessione corrente allora dobbiamo forzare l’aggiornamento del database con

sudo updatedb

A questo punto probabilmente la libreria si troverà in un percorso non standard. Non ci resta che aggiungere questo percorso nella lista dei percorsi scandagliati dal linker.

Per fare questo apriamo il file /etc/ld.so.conf (o creiamo un file nella cartella /etc/ld.so.conf.d/) e inseriamoci dentro il percorso della libreria, ad esempio:

/usr/local/lib.

A questo punto chiamiamo

sudo ldconfig

per aggiornare la cache del linker.

E il gioco è fatto.

  • Vpindarico

    Alcune precisazioni:
    - le .so non sono librerie dinamiche, ma semplicemente condivise (so sta per Shared Object)
    - le librerie dinamiche tipo dll esistono anche per Linux, non solo per Windows
    Ti conviene dare un’occhiata al Program-Library-HOWTO.

  • Giorta

    Ciao!
    Interessante e utile questo intervento

    nel caso invece la libreria non sia installata qual’e’ la procedura da seguire?

    pax

    • Vpindarico

      Non credo

      • Vpindarico

        Scappato il dito.
        Stavo scrivendo:
        Non credo di aver capito la tua domanda, in particolare la parola ‘invece’. Lascerebbe supporre che nel mio commento io parli di libreria installata, ma non è così.