2013-02-08 15 views
5

Das Problem, das ich hier gelöst wurde konfrontiert: Loading shared library in open-mpi/ mpi-runMPI - Fehler beim Laden der gemeinsam genutzten Bibliotheken

ich weiß nicht wie, Einstellung LD_LIBRARY_PATH oder Angabe -x LD_LIBRARY_PATH behebt das Problem, wenn meine Installation selbst die erforderlichen -L Argumente gibt. Meine Installation ist in ~/mpi/

Ich habe auch meine Compile-Link-Konfigurationen enthalten.

$ 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 % 

Als ich mit mpic++ <file> kompilierte und lief mit mpirun a.out habe ich einen (Shared Library) Linkerfehler

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

Der Fehler wird behoben LD_LIBRARY_PATH durch Einstellung. Die Frage ist wie und warum? Was vermisse ich? Warum ist LD_LIBRARY_PATH erforderlich, wenn meine Installation gut aussieht.

Antwort

4

libdl, libm, librt, libnsl und libutil sind alle wesentlichen systemweiten Bibliotheken und sie kommen im Rahmen der sehr einfachen Installation des Betriebssystems. libmpi und libmpi_cxx sind Teil der Open MPI-Installation und befinden sich in Ihrem Fall an einem nicht standardmäßigen Speicherort, der explizit im Linkersuchpfad LD_LIBRARY_PATH enthalten sein muss.

Es ist möglich, die Konfiguration der Open MPI-Compiler-Wrapper zu ändern und die -rpath-Option an den Linker zu übergeben. -rpath nimmt einen Bibliothekspfad und hängt ihn an eine Liste an, die in der ausführbaren Datei gespeichert ist, die dem Laufzeitlink-Editor (auch der dynamische Linker) mitteilt, wo nach Bibliotheken gesucht werden muss, bevor er die Variable LD_LIBRARY_PATH anspricht. Zum Beispiel würde in Ihrem Fall die folgende Option genügen:

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

Dies würde den Weg in den offenen MPI-Bibliotheken innerhalb der ausführbaren Datei einbetten und es würde keine Rolle, ob dieser Weg Teil LD_LIBRARY_PATH zur Laufzeit ist oder nicht.

Um die entsprechenden Wrapper diese Option in die Liste der Compiler-Flags hinzufügen zu machen, würden Sie die mpiXX-wrapper-data.txt Datei ändern müssen (wo XXcc ist, c++, CC, f90, etc.), in mpi/share/openmpi/ entfernt. Zum Beispiel machen mpicc die Option passieren, würden Sie /home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txt ändern haben und die folgenden auf die Zeile, die mit linker_flags= beginnt hinzufügen:

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

${prefix} wird automatisch erweitert durch den Wrapper auf den aktuellen Öffnen MPI Installationspfad.

+0

Seien Sie sicher, dass Ihre 'LD_LIBRARY_PATH' ist in Ihrem' .bashrc' overwitten ist wie meins mit CUDA war. Du willst etwas wie 'export LD_LIBRARY_PATH =/lib64/openmpi/lib: $ LD_LIBRARY_PATH' –

5

In meinem Fall, ich anhängen nur einfach

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

in $ HOME/.bashrc. und dann es wieder aktiv zu machen.

RK

+0

Das ist richtig! – caot

+0

Um es zu finden (z. B. auf einem großen Cluster), verwenden Sie 'whereis openmpi'. Arbeitete für mich. – khaverim

+0

Das hat tnx so viel gearbeitet –

Verwandte Themen