2014-09-18 12 views
11

Quindi, ho un programma che funziona con OpenBlas e voglio compilarlo. Il processo di collegamento è simile al seguente:Perché LD_LIBRARY_PATH è BAD e il modo corretto di caricare le librerie dinamiche

gcc -o prog prog.o -O3 -I/opt/OpenBLAS/include -L/opt/OpenBLAS/lib -lopenblas 

Fin qui tutto bene. Se rimuovo l'opzione -L, ottengo un errore nel processo di collegamento

/usr/bin/ld: cannot find -lopenblas 

Con i collegamenti -L tutto senza errori. Tuttavia, quando provo a fare funzionare io ottenere il seguente errore:

./prog: error while loading shared libraries: libopenblas.so.0: cannot open shared object file: No such file or directory 

Se ho impostato la variabile ENV LD_LIBRARY_PATH-/opt/OpenBlas/lib posso eseguire il programma, ma molte fonti come http://xahlee.info/UnixResource_dir/_/ldpath.html considerare questo per essere una cattiva pratica e mi può capire quasi tutto il ragionamento. Anche l'altro metodo menzionato nell'articolo (modifica la configurazione di LD) è considerato in qualche modo una cattiva pratica. Infine, è possibile aggiungere un collegamento simbolico alla libreria in /usr/lib. Un grosso problema con gli ultimi due metodi è che è necessario l'accesso sudo.

Quindi la mia domanda è come posso compilare ed eseguire un programma collegato a una libreria condivisa che non si trova in un percorso predefinito (/usr/lib) senza utilizzare LD_LIBRARY_PATH e accesso sudo. Nell'articolo si dice che si può semplicemente "scrivere" nel binario dove cercare le librerie condivise, ma non so come farlo (il flag -L non sembra farlo). Sarei grato se qualcuno potesse spiegare questo argomento, dato che ho cercato ovunque e sono molto confuso (alcuni riferimenti sembrano suggerire che la bandiera `-L 'dovrebbe farlo ma non funziona per me). Grazie in anticipo.

+0

È possibile utilizzare -rpath per impostare il percorso di ricerca della libreria di runtime – sshannin

risposta

12

Aggiungere il percorso al percorso di ricerca della libreria di runtime.

gcc -Wl,-rpath=/opt/OpenBlas/lib ... 

Che l'opzione -L fa in fase di collegamento, l'opzione -rpath fa in fase di esecuzione.

+3

Questa è probabilmente la risposta che l'OP sta cercando, sebbene sia anche negativa poiché costruisce il percorso nell'eseguibile, richiedendo la ricompilazione del file eseguibile per riposizionare la libreria . Quindi dovresti fondamentalmente capire tutte le soluzioni, perché sono tutte cattive, e poi scegliere quella che è la meno valida per il tuo caso d'uso. ;) –

+0

@DavidSchwartz: puoi spostare la libreria senza ricompilare, devi solo trasferirla in un'altra posizione nel percorso di ricerca runtime ... che è la stessa scelta che hai se non usi '-rpath'. E puoi sempre usare 'LD_LIBRARY_PATH' se vuoi davvero spostare la libreria da qualche altra parte. Scusa, non vedo gli svantaggi, tranne la possibilità che '-rpath' sia un po '* rumoroso * se copi il file binario su un altro sistema. –

+0

@DavidSchwartz: puoi anche modificare il 'rpath' senza ricompilare, usando lo strumento' chrpath'.Non puoi farlo su OS X a meno che il nuovo 'rpath' sia più corto, ma ahimè, niente è perfetto. –

5

Su linux, è anche possibile utilizzare $ ORIGIN in rpath per indicare il percorso della directory dell'applicazione e creare un percorso relativo da lì. Dovresti quindi spostare la libreria in un percorso relativo noto al binario.

gcc -o prog prog.o -O3 -I/opt/OpenBLAS/include -Wl,-rpath=\$ORIGIN/lib -L/opt/OpenBLAS/lib -lopenblas 

È anche possibile utilizzare il percorso completo del libary, e saranno collegati in:

gcc -o prog prog.o -O3 -I/opt/OpenBLAS/include /opt/OpenBLAS/lib/libopenblas.so 

Se si esegue "ldd" sul file eseguibile, si dovrebbe vedere il percorso completo codificato.

+0

Avrai bisogno di citare '$ ORIGIN', o la shell lo espanderà (probabilmente in una stringa vuota). ''-Wl, -rpath = $ ORIGIN/lib'' funzionerà. –

+0

buona cattura, grazie – Juan

Problemi correlati