2013-02-08 12 views
5

Problem w obliczu został tu rozwiązany: Loading shared library in open-mpi/ mpi-runMPI - Błąd ładowania biblioteki współdzielone

nie wiem jak, ustawienie LD_LIBRARY_PATH lub określając -x LD_LIBRARY_PATH rozwiązuje problem, gdy sama moja instalacja określa niezbędne argumenty -l. Moja instalacja jest w ~/mpi/

Mam również moje konfiguracje kompilacji linków.

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

Kiedy skompilowany z mpic++ <file> i pobiegł z mpirun a.out dostałam (wspólna biblioteka) linker error

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

Błąd został naprawiony poprzez ustawienie LD_LIBRARY_PATH. Pytanie brzmi: jak i dlaczego? Czego mi brakuje? Dlaczego wymagana jest LD_LIBRARY_PATH, gdy moja instalacja wygląda dobrze.

Odpowiedz

4

libdl, libm, librt, libnsl i libutil są istotne dla całego systemu bibliotek i pochodzą one jako część bardzo podstawowej instalacji systemu operacyjnego. libmpi i libmpi_cxx są częścią instalacji Open MPI, aw twoim przypadku znajdują się w niestandardowej lokalizacji, która musi być jawnie dołączona do ścieżki wyszukiwania łącznika LD_LIBRARY_PATH.

Istnieje możliwość zmiany konfiguracji otoków kompilatora Open MPI i przekazania opcji -rpath linkerowi. -rpath pobiera ścieżkę do biblioteki i dołącza ją do listy, przechowywanej w pliku wykonywalnym, która informuje edytor łącza uruchomieniowego (a.k.a. dynamiczny linker), gdzie szuka bibliotek, zanim przejrzy zmienną LD_LIBRARY_PATH. Na przykład, w przypadku następujących opcji wystarczy:

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

Byłoby to osadzić ścieżkę do bibliotek Otwarte MPI wewnątrz pliku wykonywalnego i to nie ma znaczenia, czy ta ścieżka jest częścią LD_LIBRARY_PATH w czasie pracy, czy nie.

Aby odpowiednia wrapper dodać taką opcję do listy flag kompilatora, trzeba by zmodyfikować plik mpiXX-wrapper-data.txt (gdzie XX jest cc, c++, CC, f90, itd.), Z siedzibą w mpi/share/openmpi/. Na przykład, aby mpicc przekazać opcję, trzeba by zmodyfikować /home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txt i dodać następujące linii zaczynającej się linker_flags=:

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

${prefix} jest automatycznie rozwijany przez owinięcie do bieżącej ścieżki instalacyjnej Otwarte MPI.

+0

Upewnij się, że 'LD_LIBRARY_PATH' nie jest overwitten w swoim' .bashrc' jak mój był z CUDA. Chcesz coś takiego jak 'export LD_LIBRARY_PATH =/lib64/openmpi/lib: $ LD_LIBRARY_PATH' –

5

W moim przypadku, po prostu dołącza

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

do pliku $ HOME/.bashrc. a następnie źródło do ponownego aktywowania.

RK

+0

To prawda! – caot

+0

, aby go znaleźć (np. W dużym klastrze), użyj 'whereis openmpi'. Pracował dla mnie. – khaverim

+0

To zadziałało tnx tak bardzo –