Usa le librerie condivise in / usr / local / lib


59

Ho creato alcune librerie da fonti e i file dopo make installsono dentro/usr/local/lib

Ad esempio, nel mio caso ho il file libodb-2.2.soche si trova in questa directory.

Tuttavia, quando avvio l'eseguibile collegato libodb, ho ricevuto l'errore: errore durante il caricamento delle librerie condivise:libodb-2.2.so: cannont open shared object file: No such file or directory.

Significa che ho compilato il mio eseguibile non correttamente? o dovrei indicare al sistema che potrebbero esserci anche alcune librerie interessanti nella cartella /usr/local/lib?

Sto usando Ubuntu 12.04, kernel Linux 3.2.0-38-generico.



Ti consiglio vivamente di stringere buoni rapporti di amicizia con il tuo debugger
DDS il

@DDS ti suggerisco di elaborare un po 'di più. Sai che è un sito collaborativo qui. Per favore, indica il modo in cui gdbavrebbe aiutato comunque con un linkproblema, per esempio. Sono sinceramente curioso. All'inizio la tua osservazione mi sembra estranea al problema. Ma potrei sbagliarmi. In effetti non ne so abbastanza gdbe il caricamento delle librerie.
Stephane Rolland,

Siamo spiacenti ... questo commento avrebbe dovuto essere posto su StackOverflow su una domanda dello studente sulla programmazione in C ... non ho visto se era U&L
DDS il

@DDS Principiante nell'apprendimento della programmazione C o nell'apprendimento della costruzione su Linux? Per favore, sii più preciso. Ad esempio, venivo da Windows. Ciò non significa che non conosca il C ++ ... Tendo a pensare che il tuo comportamento di giudizio non sia accurato. Anche se fosse stato su SO, il tuo comportamento presto attirerà l'attenzione dei moderatori. Sii consapevole di ciò. Sei su un sito COLLABORATIVO, con programmatori entusiasti che condividono conoscenze utili. Non progettare da qualche parte per adulare il tuo ego. (Non preoccuparti, quando ho iniziato a SO sono stato anche delicatamente / ragionevolmente picchiato e penso che sia stata davvero una buona cosa).
Stephane Rolland,

Risposte:


59

Per la sessione corrente puoi

export LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

o per rendere permanente la modifica è possibile aggiungere /usr/local/liba /etc/ld.so.conf(o qualcosa che include) ed eseguire ldconfigcome root.

Se i problemi persistono, l'esecuzione ldd [executable name]ti mostrerà le librerie che sta cercando di trovare e quali non possono essere trovate.


3
Dalla manpagina dedicata agli ldd(1)"Nel caso di consueto, LDD invoca il linker dinamico standard (vedi ld.so(8)) con la LD_TRACE_LOADED_OBJECTSvariabile d'ambiente insieme a 1, che fa sì che il linker per visualizzare le dipendenze delle librerie. Siate consapevoli, tuttavia, che in alcune circostanze, alcune versioni di lddmaggio tenta di ottenere le informazioni sulla dipendenza eseguendo direttamente il programma. Pertanto, non dovresti mai ricorrere ldda un eseguibile non attendibile , poiché ciò potrebbe comportare l'esecuzione di un codice arbitrario. Un'alternativa più sicura quando si tratta di eseguibili non attendibili è: ... "
SlySven

4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven

Bello - non ho mai incontrato objdump prima.
Flup,

Secondo questo articolo questa risposta è canonicamente errata e dannosa . Per un approccio corretto l'uso di -Le -rpathdurante la compilazione per impostare il percorso di ricerca di collegamento e il percorso di ricerca di runtime per le librerie è il modo corretto, secondo questa domanda e risposta.
Cliff Armstrong,

37

Se hai già corso ldconfigdopo aver creato la libreria, continua a leggere. Altrimenti, leggi prima su ldconfig .

/usr/local/libpotrebbe non essere nel percorso della libreria utilizzato da ldconfig. Puoi fare solo questo:

ldconfig /usr/local/lib

E le cose dovrebbero essere aggiunte alla cache del linker, ma è probabilmente meglio aggiungere il percorso correttamente. Assicurati di avere una /etc/ld.so.conf.ddirectory. In tal caso aggiungi un file (chiamalo "usr-local.conf", o qualunque altra cosa) e inserisci una riga in esso:

/usr/local/lib

Adesso corri ldconfig. Se non si dispone della directory ld.so.conf.d, è necessario disporre di un /etc/ld.so.conf file e aggiungere quella riga alla fine.


3
Ho aggiunto un file custom.conf per /etc/ld.so.conf.dpoi aver eliminato ldconfig per tenerne conto e il mio eseguibile può iniziare ora.
Stephane Rolland,
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.