2010-11-02 8 views
8

मैंने एक छोटा प्रोग्राम लिखा जिसके लिए libboost_filesystem, libboost_program_options और libcurl सहित कुछ पुस्तकालयों की आवश्यकता है।संकलित सी ++ प्रोग्राम किसी अन्य सिस्टम पर "साझा ऑब्जेक्ट फ़ाइल नहीं खोल सकता" हालांकि फ़ाइल मौजूद है

मैंने इसे अपने घर की मशीन पर संकलित किया और वहां परीक्षण करने के लिए काम पर अपने कंप्यूटर पर बाइनरी ली।

error while loading shared libraries: 
libboost_filesystem.so.1.42.0: cannot 
open shared object file 

लेकिन जब मैं इस फ़ाइल के लिए खोज मैं देख रहा हूँ कि यह में मौजूद है:: /usr/lib/libboost_filesystem.so.1.42.0 जब मैं कार्यक्रम शुरू करने की कोशिश लेकिन वहाँ यह निम्न त्रुटि संदेश देता है

क्या मैंने अपने कार्यक्रम के संकलन/लिंकिंग के दौरान कुछ गलत किया? यदि हां, तो मुझे अन्य मशीनों पर काम करने के लिए क्या करना है?

+1

मुझे अक्सर लगता है कि 'ldd' मुझे यह जानने में मदद कर सकता है कि क्या गलत है। 'Ldd।/Your_executable' क्या कहता है? –

+1

आपने जो कहा है उससे, ऐसा लगता है कि यह काम करना चाहिए। एक 32 बिट बनाम 64 बिट संघर्ष हो सकता है। आर्किटेक्चर मैच की जांच करने के लिए 'फ़ाइल'/your_executable' और 'file/usr/lib/libboost_filesystem.so.1.42.0' चलाने का प्रयास करें :) –

+1

वाह आप सही हैं। कार्यक्रम 32 बिट के रूप में बनाया गया है और लाइब्रेरी मौजूद 64 बिट – tyrondis

उत्तर

1

क्या आपने बढ़ावा के साझा बाइनरी संकलित किए और उन्हें उपयोगकर्ता को प्रदान किया?

अक्सर बढ़ावा किसी भी बाइनरी/साझा करने के लिए साझा किए बिना उपयोग किया जा सकता है। लेकिन यदि आप उपयोग करते हैं, उदाहरण के लिए, बूस्ट :: फाइल सिस्टम, आपको द्विआधारी या साझा ऑब्जेक्ट के रूप में द्विआधारी बनाना होगा, और सुनिश्चित करें कि यह अंतिम निष्पादन योग्य साझा बाइनरी खोज पथ पर उपलब्ध है।

आप बूस्ट प्रलेखन में एक व्याख्या और अधिक जानकारी प्राप्त कर सकते हैं। http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html

इस पेज से:: यहाँ लिनक्स संस्करण है

अधिकांश बूस्ट पुस्तकालयों शीर्षक-ओनली होते हैं: वे पूरी तरह से हेडर फाइल के युक्त टेम्पलेट्स और इनलाइन काम करता है, से मिलकर बनता है और कोई separately- की आवश्यकता होती है संकलित लाइब्रेरी बाइनरी या लिंक करते समय विशेष उपचार।

...

केवल बूस्ट पुस्तकालयों कि अलग से बनाया जाना चाहिए:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • बूस्ट.एमपीआई
  • Boost.ProgramOptions
  • Boost.Python (देखें Boost.Python निर्माण और इसे स्थापित करने से पहले प्रलेखन निर्माण)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • बूस्ट। सिस्टम
  • Boost.Thread
  • Boost.Wave
+0

क्या आप इसे अधिक जानकारी के साथ समझा सकते हैं? या मुझे कुछ संसाधन के लिए नेतृत्व? मैं लिनक्स विकास के लिए बिल्कुल नया हूं और इसके बारे में बहुत कुछ नहीं जानता। – tyrondis

+0

मैं इसके बारे में अधिक सटीक दस्तावेज के लिए एक लिंक जोड़ रहा हूँ। किया हुआ। – Klaim

1

ऐसा लगता है कि आपको लाइब्रेरी को स्थिर रूप से लिंक करने की आवश्यकता है। यहां एक अच्छी व्याख्या है।Boost static linking

+1

ठीक है लेकिन अगर मैं उन्हें स्थिर रूप से लिंक करता हूं तो क्या मैं साझा पुस्तकालयों पर निर्भरता रखने का लाभ नहीं खो सकता? मैंने सोचा था कि linux – tyrondis

1

क्या आपने boost_filesystem लाइब्रेरी के उसी संस्करण के विरुद्ध लिंक किया था? आप अपने आवेदन को कैसे संकलित करते हैं, इस पर निर्भर करते हुए, पुस्तकालय के एक ही संस्करण को उपस्थित होने की आवश्यकता होती है।

आपको अपने एप्लिकेशन को वास्तव में साथ के लिए लग रहा है क्या जांच करने के लिए कोशिश कर सकते:

ldd <your app name> 

शायद साथ ही अपने LD_LIBRARY_PATH वातावरण चर की जाँच करें।

+0

lld के तहत "मानक" तरीका होगा मुझे दिया \t libboost_filesystem.so.1.42.0 => नहीं मिला \t libboost_program_options.so.1.42.0 => नहीं मिला \t libboost_system.so.1.42। 0 => नहीं मिला – tyrondis

1

क्या आप सुनिश्चित कर सकते हैं कि /usr/lib/libboost_filesystem.so.1.42.0 कोई मृत लिंक नहीं है?

7

सबसे पहले, यह सुनिश्चित करने के लिए कि पुस्तकालय आपके एलडी कैश में है, कंसोल में ldconfig -p | grep libboost_filesystem.so जारी करने का प्रयास करें।

यदि ऐसा नहीं है, तो आप अपने /etc/ld.so.conf.d निर्देशिका के लिए boost.conf की तरह एक नाम के साथ एक फ़ाइल जोड़ने के लिए आवश्यकता हो सकती है। इस फ़ाइल में आपके बूस्ट लाइब्रेरीज़ का पथ होना चाहिए। फिर अपने सिस्टम के एलडी कैश को अपडेट करने के लिए sudo ldconfig चलाएं।

आशा इस में मदद मिलेगी ...

+1

thx, ऐसा करने का एक अच्छा तरीका प्रतीत होता है। शायद मानक? – unludo

1

/usr/अपने LD_LIBRARY_PATH वातावरण चर में lib है?

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

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