2012-08-14 17 views
5

एक 3 पार्टी C++ कार्यक्रम को क्रियान्वित करने जब मैं निम्नलिखित त्रुटि मिलती है:त्रुटि: libgomp.so.1: गलत जीसीसी संस्करण?

त्रुटि साझा पुस्तकालयों को लोड करते समय: libgomp.so.1: साझा वस्तु फ़ाइल नहीं खोल सकता: इस तरह के कोई फ़ाइल या निर्देशिका

libgomp.so .1 पुस्तकालय जीएनयू कंपाइलर संग्रह ओपनएमपी रनटाइम पुस्तकालय है।

क्या जीसीसी पैकेज का यह हिस्सा है? मैं प्रोग्राम को जीसीसी-4.5 के साथ एक सिस्टम पर चला सकता हूं, लेकिन जीसीसी-4.3 या जीसीसी-4.6 के साथ सिस्टम नहीं।

या मुझे एक और पैकेज स्थापित करने की आवश्यकता है?

मैंने लाइब्रेरी को डाउनलोड करके और इसे LD_LIBRARY_PATH पर डालकर gcc-4.3 के साथ सिस्टम पर मैन्युअल रूप से इसे ठीक करने का प्रयास किया, लेकिन फिर मुझे एक और गायब लाइब्रेरी मिल गई: /usr/lib/libstdc++.so.6: संस्करण `GLIBCXX_3 .4.11 'नहीं मिला। libstdc जीएनयू मानक सी ++ लाइब्रेरी है इसलिए यह जीसीसी का गलत संस्करण भी इंगित करता है?

मैं सी ++ डेवलपर नहीं हूं इसलिए मुझे पूरी तरह से पता नहीं है कि ये पुस्तकालय क्या हैं और कैसे सी पुस्तकालय सामान्य रूप से सी ++ कोड के साथ काम करते हैं।

ओएस लिनक्स 64 बिट है।

जीसीसी-4.3 मशीन: openSUSE 11.1

जीसीसी-4.5 मशीन: openSUSE 11.4 (इस मशीन पर कार्यक्रम काम करता है)

जीसीसी-4.6 मशीन: openSUSE 12.1

+0

मैं उस सिस्टम पर लिनक्स मानता हूं। वास्तविक वितरण क्या है? – unkulunkulu

+0

प्रोग्राम 64-बिट भी है? –

उत्तर

3

कार्यक्रम libgomp (libgomp.so.1) के एक विशिष्ट संस्करण के खिलाफ जुड़ा हुआ था और इसका उपयोग केवल उस द्वारा किया जा सकता है।

  1. आवेदन के स्रोत कोड प्राप्त करें और अपने सिस्टम के लिए यह अपने आप संकलन,
  2. जीसीसी के नए संस्करण के खिलाफ संकलित आवेदन के एक और संस्करण प्राप्त करें,
  3. एक स्थिर प्राप्त: तो आप या तो करने के लिए है आवेदन की जुड़ा हुआ संस्करण,
  4. अपनी वितरण का समर्थन करता है कि, समानांतर में libgomp के पुराने संस्करण को स्थापित करने,
  5. यह, आप अभी भी पुराने libgomp द्विआधारी हड़पने नहीं है, तो कर सकते हैं और (अपने /usr/lib में रख अधिमानतः, /usr/local/lib इसके बजाय यदि वह पथ आपके /etc/ld.so.conf में है),
  6. और अंत में, यदि यह संभव है तो आप इसे बनाने के लिए पुराने संस्करण में जीसीसी डाउनग्रेड कर सकते हैं। लेकिन यह एक बुरा, शॉर्ट-टाइम समाधान है।
1

लगता है अपने कार्यक्रम संकलित किया गया था और जीसीसी-4.5 का उपयोग करके लिंक किया गया है, जो तब दर्शाता है कि आपको 4.5 से पहले संस्करणों में पोर्टिंग करने वाला सिरदर्द होगा। एक distro (मानते हुए लिनक्स) के भीतर निर्भरता आसानी से clib और C++ lib जैसे कोर libs के अगले प्रमुख संस्करणों के लिए आगे लाया नहीं जाता है। अगले जीएनसी-4.3 बॉक्स के मानक लिनक्स-डिस्ट्रो रिलीज के मानक अपग्रेड करना बहुत आसान है।

जीसीसी-4.6 मशीन के लिए आपको libgomp.so.1 युक्त एक कंपैट पैकेज की खोज करने की आवश्यकता हो सकती है। यह distro निर्भर है और मैं यहां विवरण नहीं जानता।

आपके बॉक्स पर इतना-निर्भरता की जानकारी निकालने के लिए उपकरण हो सकता है, की कोशिश

man ldd

+0

वहां आरपीएम-पैकेज हैं जो जीसीसी-4.6 मामले में आपकी मदद कर सकते हैं, उदाहरण के लिए इस आरपीएम साइट पर एक पृष्ठ है [rpm.pbone.net ...] (http://rpm.pbone.net/index .php3/स्टेट/3/srodzaj/1/खोज/libgomp.so.1() (64 बिट))। (या परेशानी हो सकती है) – Jojje

2

आप comamnd ldd का उपयोग करके एक कार्यक्रम के सभी साझा लाइब्रेरी लिंक किए गए निर्भरता देख सकते हैं। उदाहरण के लिए:

$ ldd /bin/ls 
    linux-gate.so.1 => (0xb76fe000) 
    libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb76be000) 
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb76b5000) 
    libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0xb76ab000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7506000) 
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7501000) 
    /lib/ld-linux.so.2 (0xb76ff000) 
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb74e6000) 
    libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0xb74e0000) 

अब, आप एक और मशीन में इस कार्यक्रम चलाने के लिए और साझा पुस्तकालयों आप एक निर्देशिका करने के लिए बहुत कुछ कॉपी करने की कोशिश कर सकते हैं और फिर LD_LIBRARY_PATH चाल का उपयोग के संस्करण के साथ समस्याओं के लिए चाहते हैं। लेकिन ध्यान दें कि कुछ पुस्तकालयों कॉपी नहीं किया जाना चाहिए:

  • linux-gate.so: नहीं एक वास्तविक फ़ाइल है, लेकिन भूमि कर्नेल लिए एक प्रवेश द्वार।
  • /lib/ld-linux-so.2: गतिशील लोडर, (या ईएलएफ दुभाषिया, कुछ इसे कॉल करते हैं)। प्रत्येक गतिशील रूप से जुड़े निष्पादन योग्य के शीर्षलेख में इसका एक स्थिर संदर्भ है। इसे कॉपी न करें।
  • [/usr]/lib/i386-linux-gnu/*: इस निर्देशिका में सबकुछ वास्तुकला विशिष्ट है। यह काम कर सकता है अगर दोनों मशीनों में एक ही वास्तुकला है।यदि नहीं, तो आपको [/usr]/lib/<your-real-arch>/* के तहत एक ही नाम के साथ लाइब्रेरी की तलाश करनी होगी।

लक्ष्य मशीन में, आप भी ldd उपकरण export LD_LIBRARY_PATH=... के बाद का उपयोग करता है, तो यह पुस्तकालयों की उम्मीद के रूप में हल करने को देखने के लिए कर सकते हैं।

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