2013-02-08 15 views
5

समस्या मैं का सामना करना पड़ा यहाँ हल किया गया है: Loading shared library in open-mpi/ mpi-runएमपीआई - लोड करने में त्रुटि साझा पुस्तकालयों

मुझे नहीं पता कैसे, LD_LIBRARY_PATH स्थापित करने या -x LD_LIBRARY_PATH समस्या ठीक करता है निर्दिष्ट करते समय, जब मेरे स्थापना ही आवश्यक एल तर्क निर्दिष्ट करता है। मेरी स्थापना ~/mpi/

में मैंने अपनी संकलन-लिंक कॉन्फ़िगरेशन भी शामिल की है।

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

जब मैं mpic++ <file> साथ संकलित और mpirun a.out साथ भाग गया मैं एक (शेयर की गई लाइब्रेरी) लिंकर त्रुटि

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

त्रुटि LD_LIBRARY_PATH की स्थापना द्वारा निर्धारित किया गया है हो गया। प्रश्न यह है कि क्यों और क्यों? मैं क्या खो रहा हूँ? LD_LIBRARY_PATH क्यों आवश्यक है जब मेरी स्थापना ठीक दिखती है।

उत्तर

4

libdl, libm, librt, libnsl और libutil सभी आवश्यक सिस्टम-वाइड पुस्तकालयों हैं और वे बहुत ही बुनियादी ओएस स्थापना के भाग के रूप में आते हैं। libmpi और libmpi_cxx ओपन एमपीआई इंस्टॉलेशन का हिस्सा हैं और आपके मामले में एक गैर-मानक स्थान पर स्थित है जिसे स्पष्ट रूप से लिंकर खोज पथ LD_LIBRARY_PATH में शामिल किया जाना चाहिए।

ओपन एमपीआई कंपाइलर रैपर की कॉन्फ़िगरेशन को संशोधित करना संभव है और उन्हें लिंकर को -rpath विकल्प पास करना संभव है। -rpath लाइब्रेरी पथ लेता है और इसे निष्पादन योग्य फ़ाइल के अंदर संग्रहीत सूची में जोड़ता है, जो रनटाइम लिंक एडिटर (ए.के.ए. गतिशील लिंकर) को बताता है कि LD_LIBRARY_PATH चर का संसाधित करने से पहले पुस्तकालयों की खोज कहां से करें। उदाहरण के लिए, आपके मामले में निम्नलिखित विकल्प पर्याप्त होगा:

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

यह निष्पादन के अंदर ओपन एमपीआई पुस्तकालयों के लिए पथ एम्बेड हैं और इससे कोई फर्क नहीं होता अगर उस पथ रन टाइम पर है या नहीं LD_LIBRARY_PATH का हिस्सा है।

इसी आवरण संकलक झंडे की सूची में उस विकल्प को जोड़ने के लिए, आपको mpiXX-wrapper-data.txt फ़ाइल को संशोधित करने के लिए होता है (जहां XX है cc, c++, CC, f90, आदि), mpi/share/openmpi/ में स्थित है। उदाहरण के लिए, mpicc विकल्प पारित करने के लिए, आप /home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txt को संशोधित करने और लाइन है कि linker_flags= साथ शुरू होता है के लिए निम्न जोड़ना होगा:

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

${prefix} स्वचालित रूप से वर्तमान ओपन एमपीआई स्थापना पथ के लिए आवरण से विस्तार होता है।

+0

सुनिश्चित करें कि आपके 'LD_LIBRARY_PATH' अपने' .bashrc' में overwitten किया जा रहा है की तरह मेरा CUDA के साथ था रहें। आप कुछ निर्यात करना चाहते हैं जैसे निर्यात LD_LIBRARY_PATH =/lib64/openmpi/lib: $ LD_LIBRARY_PATH' –

5

मेरे मामले में, मैं बस $ HOME/.bashrc फ़ाइल में संलग्न कर देता है

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

। और उसके बाद इसे फिर से सक्रिय करने के लिए स्रोत।

आरके

+0

यह सही है! – caot

+0

इसे खोजने के लिए (उदा। बड़े समूह पर) 'जहां ओपनंपी' का उपयोग करें। मेरे लिए काम किया – khaverim

+0

यह tnx इतना काम किया –

संबंधित मुद्दे