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.
È possibile utilizzare -rpath per impostare il percorso di ricerca della libreria di runtime – sshannin