2013-07-26 10 views
24

मैं ohNet नामक ढांचे का उपयोग करके एक एप्लिकेशन बना रहा हूं। ढांचे के निर्माण के बाद, make install के माध्यम से ढांचे को स्थापित करने की संभावना है। डिफ़ॉल्ट रूप से पुस्तकालय /usr/local/[lib|include] फ़ोल्डरों के अंदर स्थापित होते हैं। ठीक।/usr/local/lib में पुस्तकालय नहीं मिला

मैं विकास के लिए ग्रहण का उपयोग कर रहा हूं। इस पुस्तकालयों का उपयोग करने के लिए मुझे पुस्तकालय में पथ शामिल करना होगा (इस मामले में usr/local/include/ohNet), लिंकर खोज पथ (-एल) (/usr/local/lib/ohNet) और विशिष्ट पुस्तकालय (-एल) सेट करें (इस मामले में मैं एक लाइब्रेरी चुनता हूं libohNet.so कहा जाता है जो इस फोल्डर में है जब मैं परियोजना ग्रहण में यह ठीक काम करता है का निर्माण, फिर भी अगर मैं programm मैं निम्न संदेश के साथ सामना कर रहा हूँ चलाने का प्रयास:।

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

मैं डबल जाँच लिया है यह, और फ़ाइल libohNet.so इस निर्देशिका में है! इस फ़ाइल को नहीं मिला है?

मैं गूगल पर खोज की है और पाया कुछ पदों करते हुए कहा कि यह समस्याग्रस्त है कि पुस्तकालयों /usr/libsee here के बजाय /usr/local/lib में स्थापित हो रहे हैं ... मैं eclipse में कुछ अतिरिक्त सेटिंग कॉन्फ़िगर करने ld इस पथ में पुस्तकालयों को पहचानते हैं है? इसके लिए समाधान क्या है?

+0

अपनी लिंकर लाइन में '-L/usr/local/lib' जोड़ें। –

+0

मैंने पहले ही लिंकर सर्चपाथ को '/ usr/local/lib/ohNet' – Moonlit

+0

पर सेट कर दिया है, फिर आपको यह जांचना होगा कि आप वास्तव में फ़ाइल को पढ़ सकते हैं, और यह सही प्रकार की .so फ़ाइल है - उदाहरण के लिए, 32 मिश्रण और 64 बिट? –

उत्तर

43

यह रनटाइम त्रुटि है, बिल्ड त्रुटि नहीं है। -L ध्वज सेट करना रनटाइम लिंकर के लिए कुछ भी नहीं करता है। आपको रनटाइम लोडर को पुस्तकालयों के लिए/usr/local/lib में देखने के लिए क्या करना है। आप इसे दो तरीकों से कर सकते हैं। पहले LD_LIBRARY_PATH वातावरण चर के लिए पथ को जोड़ने के लिए है:

 
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" 

दूसरे क्रम लिंकर की विन्यास फाइल अद्यतन करने के लिए है। यह या तो /etc/ld.so.conf फ़ाइल में, लाइन डालकर हो सकता है: उस फ़ाइल में कहीं

 
/usr/local/lib 

, या /etc/ld.so में एक नया * .conf फ़ाइल बनाने के द्वारा .conf.d/निर्देशिका जिसमें नया पथ है।

 
/etc/ld.so.conf.d/99local.conf 
बस के साथ

: उदाहरण के लिए:

 
/usr/local/lib 
उस में

। ऐसा करने का यह अनुशंसित तरीका है, क्योंकि यह आपको सिस्टम द्वारा निर्धारित पथों से अलग अपने कस्टम लाइब्रेरी पथ को अलग रखने की अनुमति देता है। ("99" उपसर्ग यह सुनिश्चित करने के लिए है कि फ़ाइल को दूसरी फाइलों की तुलना में पिछली बार लोड किया गया है, ताकि यह सिस्टम पथों को पूर्ववत नहीं करेगा जिसमें समान पुस्तकालय हो सकते हैं।)

फ़ाइल को संशोधित/बनाने के बाद में/आदि, आपको चलाने की आवश्यकता है:

 
ldconfig 

परिवर्तन के प्रभावी होने के लिए रूट के रूप में। (यह आदेश /etc/ld.so.cache फ़ाइल को अद्यतन करता है, जो रनटाइम लिंकर द्वारा उपयोग की जाने वाली वास्तविक फ़ाइल है।)

रनटाइम पर आवश्यक लाइब्रेरी खोजने के लिए बाइनरी के लिए एक और तरीका भी है। आप वास्तव में निष्पादन योग्य में हार्ड-कोड लाइब्रेरी पथ बना सकते हैं। यह एक तथाकथित "rpath" सेट करके पूरा किया जाता है।यह एक लिंकर विकल्प है और इसे लिंकर को जीसीसी (या जी ++) से पारित किया जाना चाहिए, इसलिए -Wl विकल्प का उपयोग किया जाना चाहिए। लिंकर विकल्प -rpath=PATH है। तो आप अपने लिंक झंडे में जोड़ने के लिए की आवश्यकता होगी:

 
-Wl,-rpath=/usr/local/lib 

मैं हालांकि आपके मामले के लिए यह सलाह नहीं देते। जब आप अपने निष्पादन योग्य (शायद एक इंस्टॉलर के साथ), और एक रिश्तेदार rpath (rpath $ORIGIN सुविधा का उपयोग करके) के साथ पुस्तकालयों को शिपिंग करते हैं तो एक rpath उपयोगी होता है या पूर्ण एक (उदाहरण के लिए जब आप/opt में स्थापित करते हैं) के लिए उपयोग किया जाता है रनटाइम पर उन बंडल libs खोजें।

+0

सटीक उत्तर के लिए धन्यवाद। अगर मेरी लाइब्रेरी/usr/local/lib (उदा।/usr/local/lib/ohNet) के सबफ़ोल्डर में हैं तो मुझे सबफ़ोल्डर को प्रत्येक पथ जोड़ना होगा। रनटाइम लोडर को/usr/loal/lib में दोबारा खोजने के लिए कहने का कोई तरीका है? – Moonlit

+0

@ user1291235 आपको प्रत्येक व्यक्ति को अपनी लाइन में अलग से जोड़ना होगा। –

+1

@ user1291235 मैं rpath लिंक विकल्प का उल्लेख करना भूल गया। मैं आपके मामले में इसकी अनुशंसा नहीं करता हूं, लेकिन इसके बारे में जानना अच्छा लगता है इसलिए मैंने इसे उत्तर में जोड़ा है। –

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