2011-08-22 17 views
7

जब मैं अपने कंप्यूटर में एक C++ कार्यक्रम संकलन मेरा विश्वविद्यालय सर्वर पर इसे चलाने के लिए ++ जी का उपयोग कर और निष्पादन योग्य हस्तांतरण, मैंlibstdC++ GLIBCXX संस्करण त्रुटियों

./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main) 

प्राप्त कार्यक्रम अपने कंप्यूटर पर अच्छी तरह से चलाता है, और मैं डॉन मेरे विश्वविद्यालय सर्वर पर किसी भी नए सॉफ्टवेयर को स्थापित करने के लिए विशेषाधिकार नहीं हैं।

कोई मदद? धन्यवाद

+0

विश्वविद्यालय में libstdC++ संस्करण क्या है? – phoxis

+0

@phoxis, 3.4.8 या इससे अधिक, ऐसा लगता है। – bdonlan

उत्तर

7

यह आप एक साझा पुस्तकालय (डिफ़ॉल्ट व्यवहार) के रूप में मानक पुस्तकालय का उपयोग कर रहे हैं जब घर पर अपने कार्यक्रम को जोड़ने लगता है।

लाइब्रेरी को वास्तव में "लिंकिंग" करने के बजाय, आपका लिंकर कुछ प्रतीकों को हल करता है और लाइब्रेरी की वास्तविक लोडिंग को समय-समय पर देरी करते समय एक और ऑपरेशन करता है।

जब आप अपने विश्वविद्यालय कंप्यूटर पर अपने कार्यक्रम क्रियान्वित, लोडर (प्रोग्राम है जो वास्तव में स्मृति में अपने कार्यक्रम लोड करता है और मुख्य थ्रेड फेंकता) लाइब्रेरी को अपने कार्यक्रम की जरूरत के लिए लग रहा है और उन्हें लोड करने की कोशिश करता (linux में LD_LIBRARY_PATH के लिए देखो यदि आप उत्सुक महसूस करते हैं)।

समस्या यह है कि आप अपने कार्यक्रम को stdlib के संस्करण के साथ घर पर जोड़ रहे हैं जो कि विश्वविद्यालय में आपके जैसा ही संस्करण नहीं है। तो जब लोडर लाइब्रेरी को खोजने का प्रयास करता है, तो यह विफल हो जाता है, और इसलिए आपका प्रोग्राम नहीं चलाया जा सकता है।

समाधान:

क) इन सभी समस्याओं गतिशील जोड़ने के बजाय जोड़ने स्थिर का उपयोग से बचने के लिए। मुझे यकीन नहीं है कि यह stdlib के साथ संभव है, लेकिन मुझे लगता है कि यह परीक्षण करने के लायक है (देखें: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html और "-स्टैटिक" ध्वज देखें)

बी) आप अपने विश्वविद्यालय कंप्यूटर पर अपने प्रोग्राम को संकलित करने का प्रयास कर सकते हैं तो यह वहां संस्करण का उपयोग करेगा।

सी) यह जानने का प्रयास करें कि कौन सा stdlib संस्करण स्थापित है और अपने कंपाइलर मशीन में एक ही संस्करण स्थापित करें।

डी) आप अपने आवेदन के समान फ़ोल्डर में stdlib के अपने होम संस्करण की प्रतिलिपि बनाने का प्रयास कर सकते हैं।यह आम तौर पर काम करता है क्योंकि लोडर पर्यावरण परिवर्तनीय LD_LIBRARY_PATH (लिनक्स)

उम्मीद है कि मदद करता है में पथ सेट में देखने से पहले वर्तमान अनुप्रयोग फ़ोल्डर में साझा पुस्तकालयों की खोज करता है।

पी.एस .: यहाँ आप बनाम साझा/गतिशील पुस्तकालयों http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

और यहाँ (http://en.wikipedia.org/wiki/Library_%28computing%29) एक बहुत अच्छा है लेकिन अधिक पूरा नहीं हुआ पुस्तकालय वर्णन स्थिर करने के लिए एक अच्छा परिचय दिया है।

+1

'-स्टैटिक' से बेहतर विकल्प '-static-libstdC++' होगा जो केवल libstdC++ को पूरी तरह से लिंक नहीं करता है, पूरे कार्यक्रम में। –

4

libstdc++.so.6 का संस्करण विश्वविद्यालय कंप्यूटर पर बहुत पुराना है। आपके पास दो विकल्प हैं:

  1. -static के साथ स्थिर रूप से लिंक करें। सी ++ लाइब्रेरी को अंतिम बाइनरी में विलय कर दिया जाएगा।
  2. अपने घर निर्देशिका में कहीं भी सही संस्करण की प्रतिलिपि बनाएँ, फिर इसे -rpath /path/to/library/directory को बिल्ड समय पर पास करके या LD_LIBRARY_PATH पर्यावरण परिवर्तक को libstdc++.so.6 युक्त निर्देशिका को इंगित करने के लिए संदर्भित करें।
+0

बहुत धन्यवाद bdonian, क्या यूनिवर्सिटी सर्वर में निष्पादित होने पर स्थिर लिंकिंग प्रोग्राम धीमा हो जाता है? – Tarek

+0

@Tarek, स्थिर लिंकिंग में कई पेशेवर और विपक्ष हैं, लेकिन मुझे नहीं लगता कि आप वास्तव में एक गति अंतर देखेंगे। – bdonlan

+0

@bdonian के रूप में कहा गया है कि कई पेशेवर और विपक्ष हैं, लेकिन आपके मामले में मुख्य आकार आकार होगा। एक स्थैतिक रूप से जुड़ा हुआ प्रोग्राम गतिशील रूप से जुड़े एक से बड़ा है क्योंकि स्थैतिक-जुड़े एक में पुस्तकालय निष्पादन योग्य के अंदर "शामिल" होते हैं। – thamurath

1

आप किस प्लेटफॉर्म के लिए संकलन करने की कोशिश कर रहे हैं? यानी 'आपका कंप्यूटर' और आपका 'यूनिवर्सिटी सर्वर'?

आप अपने प्रोग्राम को स्थिर लिंकिंग विकल्प के साथ संकलित करने का प्रयास कर सकते हैं। यह पहले से लोड सभी lib निर्भरताओं के साथ एक स्थिर रूप से जुड़े निष्पादन योग्य उत्पन्न करेगा।

चीयर्स,

3

आप सर्वर की अपनी होम निर्देशिका का कोई उप निर्देशिका के /usr/lib/libstdc++.so.6 के अपने संस्करण कॉपी कर सकते हैं, ~/lib कहना और फिर चलाएँ:

$ LD_LIBRARY_PATH=$HOME/lib ./main 

या आप

$ export LD_LIBRARY_PATH=$HOME/lib 
$ ./main 

और कार्यक्रम पसंद करते हैं सिस्टम की बजाय अपनी निजी लाइब्रेरी लोड करनी चाहिए।

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