2010-02-18 12 views
5

इम qmake का उपयोग कर Ubuntu 9.10ld लिंकेज समस्याओं:/usr/bin/ld: नहीं मिल रहा है [libraryname]

यह साझा लाइब्रेरी (ए) पर एक साझा पुस्तकालय का निर्माण करने के लिए एक साझा लाइब्रेरी पर निर्भरता (बी) है ।

प्रोजेक्ट बी सफलतापूर्वक बनाया गया है।

परियोजना एक के लिए .pro फ़ाइल में, मेरे LIBS चर इस तरह दिखता है:

LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0 

(मैं पूरी shlib नाम का इस्तेमाल किया क्योंकि पुस्तकालय संस्करणों अलग हैं।)

किसी भी मामले में, जब मैं परियोजना एक का निर्माण करने का प्रयास है, यह संबंध चरण में टूट जाता है, और त्रुटि संदेश प्रिंट:

/usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0 
collect2: ld returned 1 exit status 
make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1 
make ***[release] Error 2 
Exited with code 2 

त्रुटि संदेश से, मैंने सोचा था कि ld शिकायत करते हुए कि यह एल नहीं कर सका libdatelib फ़ाइल को ओसीट करें, इसलिए मैंने मैन्युअल रूप से इसे/usr/lib/

पर कॉपी किया है, जिसने समस्या को हल नहीं किया है, और मुझे एक ही त्रुटि संदेश मिल रहा है।

कोई भी जानता है कि इसे कैसे ठीक किया जाए?

[संपादित करें]

मैं काफी जीसीसी का उपयोग कर के निर्माण के लिए नया हूँ। मुझे पता है कि प्रतीकात्मक लिंक कैसे बनाएं, लेकिन मैं lnk कमांड के लिए किस पथ का उपयोग करता हूं? जिस फ़ाइल को मैं लिंक करना चाहता हूं वह/home/username/work/cppdev/datelib/bin में है।

इसके अलावा निर्माण प्रणाली (qmake) मैं का उपयोग करें, स्वचालित रूप से निर्माण के हिस्से के रूप सांकेतिक लिंक बनाता है, तो मैं पहले से ही मेरे/घर/उपयोगकर्ता नाम/कार्य/cppdev/datelib/bin फ़ोल्डर में निम्न फ़ाइलें हैं:

  • libdatelib_release.so (प्रतीक लिंक)
  • libdatelib_release.so.1 (प्रतीक लिंक)
  • libdatelib_release.so.1.0 (प्रतीक लिंक)
  • libdatelib_release.so.1.0.0 (साझा लिब)

मुझे यह बताने के लिए एक और सवाल पूछना पड़ सकता है कि इतने सारे सिम्लिंक क्यों हैं (बिंदु क्या है?), और क्यों मैं सीधे साझा साझा lib से लिंक नहीं कर सकता, लेकिन एक प्रतीकात्मक लिंक से गुजरना है। मैंने कुछ ऑनलाइन दस्तावेज़ पढ़े हैं, लेकिन जो मैंने अभी तक देखा है, वास्तविक तकनीकी कारणों की बजाय dictum/परंपरा की तरह लगता है क्यों लिनक्स पर लिंक करते समय इस स्तर का अवशोषण आवश्यक है।

+0

मैं निर्माण और लिनक्स के तहत जोड़ने पर एक विशेषज्ञ नहीं हूँ और अक्सर तुम्हारा करने के लिए इसी तरह की समस्याओं पड़ा है जोड़ें। हालांकि, मैं क्या कर सकता हूं आईबीएम डेवलपर वर्क्स पर साझा पुस्तकालयों से निपटने के बारे में निम्नलिखित उत्कृष्ट लेख की सिफारिश करता है: [** _ साझा पुस्तकालयों को विच्छेदन करना - अपनी साझा लाइब्रेरी _ ** (पीटर सिबैक द्वारा)] [देखेंबैक] को जानें। खंड _ "गतिशील लिंकर खोज पथ को संशोधित करना" _ विशेष रूप से आपके लिए ब्याज की हो सकती है। [seebach]: http://www.ibm.com/developerworks/linux/library/l-shlibs.html – stakx

उत्तर

9

आप इस तरह से उपयोग नहीं कर सकते हैं। -l केवल libFOO.so के माध्यम से -lFOO के माध्यम से चीजों को ढूंढ सकता है। यदि आप इसे बिल्ड में निर्दिष्ट करना चाहते हैं तो आपको संस्करण संख्या के बिना एक प्रतीकात्मक लिंक की आवश्यकता है।

कुछ की तरह:

ln -s /the/path/to/the/libthing.so.1.0.0 /the/path/to/the/libthing.so 

अब -lthing काम करेंगे।

+0

क्षमा करें, मैं लिनक्स पर निर्माण करने के लिए काफी नया हूं। मुझे पता है कि प्रतीकात्मक लिंक कैसे बनाएं, लेकिन मैं lnk कमांड के लिए किस पथ का उपयोग करता हूं? फ़ाइल मैं चाहता हूँ में है से जोड़ने के लिए/घर/उपयोगकर्ता नाम/कार्य/cppdev/datelib/bin –

3

उपसर्ग 'lib' स्वचालित रूप से लाइब्रेरी नाम में जोड़ा जाता है - उपयोग:

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0 
+0

मेरे लिए यह dosent काम ... मेरे लिए –

0

आप पूरा पथ प्रदान कर सकता है। अर्थात

LIBS += ../datelib/bin/libdatelib_release.so.1.0.0 

हालांकि मैं क्या सुझाव दिया bmargulies करने के लिए आप की सिफारिश करेंगे: symolic लिंक बना सकते हैं और -ldatelib_release

+0

यह dosent काम ... –

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