2009-12-27 16 views
5

क्योंकि पल के लिए माफी माँगता हूँ मैं पर्यावरण प्रयोग और अपने आप निम्न प्रश्नों को हल करने की जरूरत नहीं है । जबकि से जोड़ने के लिए पुस्तकालयों का उल्लेख करते समय निम्न दृष्टिकोण के बीच मतभेदों को क्या कर रहे हैं:जीसीसी लिंकर पर प्रश्न

ए) -l:libmylib_super.a
बी) -llibmylib_super
सी) -lmylib_super
डी) -lmylib_dumb

2) आदमी पृष्ठ से -static की परिभाषा :

डायनामिक लिंकिंग का समर्थन करने वाले सिस्टम पर, यह लिंकिंग बुद्धि को रोकता है एच साझा पुस्तकालयों। अन्य सिस्टम पर, इस विकल्प का कोई प्रभाव नहीं है।

क्या इस लिंकर विकल्प के पास प्रश्न # 1 के साथ कुछ भी करना है? या ... किसी भी मौके से वे एक दूसरे के साथ हस्तक्षेप करेंगे?

धन्यवाद।

--- 2009-12-28 संपादित ---

मैं बस जाने और थोड़ा प्रयोग, DATE_TIME पुस्तकालय बूस्ट से लिंक करके मेरी वातावरण मिला है। मान लें कि मेरे पास तीन लाइब्रेरी फाइलें हैं: libboost_date_time-mt-d.a, libboost_date_time-mt-d.so.1.41.0, libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0 (sym link)।

ए .1) -l:libboost_date_time-mt-d.a ==> लाइब्रेरी फ़ाइल के बिना भी ठीक है, द्विआधारी काम करता है। -static ==>जोड़ने त्रुटि/usr/bin/ld: cannot find -lm

C.1) -lboost_date_time-mt-d ==> जोड़ने ठीक है, द्विआधारी काम करता है लेकिन शेयर की गई लाइब्रेरी फ़ाइल की आवश्यकता के साथ
.2) -l:libboost_date_time-mt-d.a
C.2) -static ==>जोड़ने त्रुटि/usr/bin/ld: cannot find -lm

.2 और C.2 में त्रुटि के बारे में कोई विचार के साथ -lboost_date_time-mt-d?

इसके अतिरिक्त, सी .1 में प्रोग्राम चलाते समय, यह साझा लाइब्रेरी फ़ाइल को libboost_date_time-mt-d.so.1.41.0 नाम से खोजता है लेकिन libboost_date_time-mt-d.so नहीं है। यदि प्रोग्राम लाइब्रेरी के सटीक संस्करण के बिना सिस्टम पर चल रहा है तो यह असुविधाजनक नहीं होगा? साझा लाइब्रेरी का उपयोग करते समय संस्करण को संभालने का व्यावहारिक तरीका क्या हो सकता है?

उत्तर

9

मैनुअल के अनुसार,

ए) वास्तव में libmylib_super.a (किसी साझा लाइब्रेरी व्यवहार लागू नहीं होता)

बी के लिए खोज पहले नाम की एक फ़ाइल के लिए पुस्तकालय पथ खोज) के लिए पुस्तकालय पथ खोज नाम की एक फ़ाइल liblibmylib_super.so पहले तो liblibmylib_super.a अगर -static नाम की एक फ़ाइल के लिए liblibmylib_super.a या केवल खोज प्रयोग किया जाता है - ध्यान दें यह लिंकर कि lib उपसर्ग और फाइल एक्सटेंशन

सी) कहते है एक के लिए पुस्तकालय पथ खोज नाम की फ़ाइल libmylib_super.so पहले तो liblibmylib_super.so अगर -static प्रयोग किया जाता है

डी) सी देखें)

ध्यान दें कि बी) नाम दिया है क्योंकि यह लिंकर कि करने के लिए lib उपसर्ग जोड़ना चाहिए है काम नहीं करेगा एक फ़ाइल के लिए libmylib_super.a या केवल खोजें पुस्तकालय का नाम।

ध्यान दें कि डी) काम नहीं करेगा क्योंकि आपका mylib_dumb नामकरण सम्मेलन का पालन नहीं करता है।

GNU Linker Manual देखें:

-l namespec

--library = namespec

लिंक करने के लिए फ़ाइलों की सूची को namespec द्वारा निर्दिष्ट संग्रह या वस्तु फ़ाइल जोड़ें। इस विकल्प का इस्तेमाल कई बार किया जा सकता है। यदि नेमस्पेक फॉर्म का है: फ़ाइल नाम, ld फ़ाइल नाम नामक फ़ाइल के लिए लाइब्रेरी पथ खोजेगा, अन्यथा यह libnamespec.a नामक फ़ाइल के लिए लाइब्रेरी पथ खोजेगा।

साझा पुस्तकालयों का समर्थन करने वाले सिस्टम पर, ld libnamespec.a के अलावा अन्य फ़ाइलों की खोज भी कर सकता है। विशेष रूप से, ईएलएफ और सनोस सिस्टम पर, ld libnamespec.a नामक लाइब्रेरी के लिए एक निर्देशिका खोजेगा जिसे libnamespec.a कहा जाता है। (सम्मेलन के अनुसार, एक .so एक्सटेंशन एक साझा लाइब्रेरी इंगित करता है।) ध्यान दें कि यह व्यवहार इस पर लागू नहीं होता है: फ़ाइल नाम, जो हमेशा फ़ाइल नाम नामक फ़ाइल निर्दिष्ट करता है।

लिंकर केवल एक ही स्थान पर एक संग्रह खोजेगा, जहां वह कमांड लाइन पर निर्दिष्ट है। यदि संग्रह किसी ऐसे ऑब्जेक्ट को परिभाषित करता है जो कमांड लाइन पर संग्रह से पहले दिखाई देने वाली किसी ऑब्जेक्ट में अपरिभाषित था, तो लिंकर में संग्रह से उचित फ़ाइल (ओं) शामिल होगी। हालांकि, कमांड लाइन पर बाद में दिखाई देने वाली ऑब्जेक्ट में एक अनिर्धारित प्रतीक लिंकर को संग्रह को फिर से खोजने का कारण नहीं बनता है। एक तरह से अभिलेखागार कई बार खोज करने के लिए मजबूर करने के लिए लिंकर के लिए (विकल्प

आप कमांड लाइन पर एक ही संग्रह से अधिक बार सूचीबद्ध कर सकते

संग्रह खोज के इस प्रकार के मानक है -

देखें।। यूनिक्स लिंकर्स के लिए। हालांकि, यदि आप AIX पर एलडी का उपयोग कर रहे हैं, तो ध्यान दें कि यह AIX लिंकर के व्यवहार से अलग है।

+0

सुधार: जब '-स्टैटिक' निर्दिष्ट किया गया है, केवल '.a' खोजा जाएगा , '.so' – iamamac

+0

ओह हाँ नहीं! –

+0

आप एम पा सकते हैं इस वेबसाइट पर विभिन्न विकल्पों पर अयस्क की जानकारी: http://gcc.gnu.org/onlinedocs/gcc/ –

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