2013-02-08 11 views
5

Il problema che ho riscontrato è stato risolto qui: Loading shared library in open-mpi/ mpi-runMPI - librerie di errore di caricamento condiviso

io non so come, impostando LD_LIBRARY_PATH o specificando -x LD_LIBRARY_PATH risolve il problema, quando la mia installazione stessa specifica gli argomenti -L necessarie. La mia installazione è in ~/mpi/

Ho incluso anche il mio compilazione-link configurazioni.

$ mpic++ -showme:version 
mpic++: Open MPI 1.6.3 (Language: C++) 

$ mpic++ -showme 
g++ -I/home/vigneshwaren/mpi/include -pthread -L/home/vigneshwaren/mpi/lib 
-lmpi_cxx -lmpi -ldl -lm -Wl,--export-dynamic -lrt -lnsl -lutil -lm -ldl 

$ mpic++ -showme:libdirs 
/home/vigneshwaren/mpi/lib 

$ mpic++ -showme:libs 
mpi_cxx mpi dl m rt nsl util m dl % Notice mpi_cxx here % 

Quando ho compilato con mpic++ <file> e corse con mpirun a.out ho ottenuto un (libreria condivisa) linker errore

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

L'errore è stato risolto impostando LD_LIBRARY_PATH. La domanda è come e perché? Cosa mi manca? Perché LD_LIBRARY_PATH richiesta quando la mia installazione sembra proprio bene.

risposta

4

libdl, libm, librt, libnsl e libutil sono tutte le librerie a livello di sistema essenziali e vengono come parte dell'installazione di molto di base del sistema operativo. libmpi e libmpi_cxx sono parte dell'installazione Open MPI e nel tuo caso si trovano in una posizione non standard che devono essere esplicitamente inclusi nel percorso di ricerca linker LD_LIBRARY_PATH.

È possibile modificare la configurazione dei wrapper del compilatore Open MPI e farli passare l'opzione -rpath al linker. -rpath prende un percorso di libreria e aggiunge la sua a un elenco, memorizzata all'interno del file eseguibile, che racconta l'editor di collegamento runtime (anche noto come il linker dinamico) dove cercare librerie, prima consulta la variabile LD_LIBRARY_PATH. Ad esempio, nel tuo caso la seguente opzione sarebbe sufficiente:

-Wl,-rpath,/home/vigneshwaren/mpi/lib 

Ciò incorporare il percorso per le librerie Open MPI all'interno del file eseguibile e non importa se quel percorso fa parte del LD_LIBRARY_PATH in fase di esecuzione o meno.

per rendere il relativo involucro aggiungere l'opzione alla lista dei flag di compilazione, si dovrà modificare il file mpiXX-wrapper-data.txt (dove XX è cc, c++, CC, f90, ecc), con sede a mpi/share/openmpi/. Ad esempio, per rendere mpicc passare l'opzione, si dovrà modificare /home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txt e aggiungere il seguente alla riga che inizia con linker_flags=:

linker_flags= ... -Wl,-rpath,${prefix}/lib 

${prefix} si espande automaticamente dal wrapper per il percorso di installazione corrente Open MPI.

+0

Assicurarsi che il 'LD_LIBRARY_PATH' non viene overwitten in' .bashrc' come la mia era con CUDA. Volete qualcosa di simile a 'export LD_LIBRARY_PATH =/lib64/openmpi/lib: $ LD_LIBRARY_PATH' –

5

Nel mio caso, ho semplicemente accoda

export LD_LIBRARY_PATH=/PATH_TO_openmpi-version/lib:$LD_LIBRARY_PATH 

nel file $ HOME/.bashrc. e quindi ricollegarlo nuovamente a attivo.

RK

+0

Questo è corretto! – caot

+0

per trovarlo (ad esempio su un cluster di grandi dimensioni) utilizzare 'whereis openmpi'. Ha funzionato per me – khaverim

+0

Questo ha funzionato tnx così tanto –

Problemi correlati