2012-03-31 34 views
21

का उपयोग कर स्थिर पुस्तकालय को जोड़ने का सही तरीका यह क्यों है कि कुछ स्थिर पुस्तकालय (lib * .a) को उसी तरह से जोड़ा जा सकता है जैसे साझा पुस्तकालय (lib * .so) जुड़े हुए हैं (ld -l स्विच), लेकिन कुछ नहीं कर सकते?जीसीसी

मुझे हमेशा सिखाया गया था कि सभी पुस्तकालयों, स्थैतिक या नहीं, को -l से जोड़ा जा सकता है ... हालांकि, मैं अब तक एक पुस्तकालय में चला गया हूं (जीएलएफडब्लू), जो कुछ भी नहीं करता है लेकिन "अपरिभाषित संदर्भ" लिंक त्रुटियों अगर मैं इसे इस तरह से जोड़ने का प्रयास करता हूं।

this question पर प्रतिक्रिया के अनुसार, स्थैतिक पुस्तकालयों को जोड़ने का "उचित" तरीका उन्हें -l का उपयोग करने के बजाय, सीधे अपनी ऑब्जेक्ट फ़ाइलों के साथ शामिल करना है। और, जीएलएफडब्ल्यू पुस्तकालय के मामले में, यह निश्चित रूप से इस मुद्दे को हल करता है। लेकिन एलएल के साथ जुड़े हुए हर दूसरे स्थैतिक पुस्तकालय का उपयोग मैं ठीक काम करता हूं।

तो:

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

उत्तर

25

उत्तर के लिए धन्यवाद! लिंक ऑर्डर के कारण समस्या को हल करता है। जाहिर है, यदि आप एक लाइब्रेरी का उपयोग करते हैं जिसमें बदले में अन्य लाइब्रेरी निर्भरताएं हैं, तो उन अन्य निर्भरताओं को को लाइब्रेरी के बाद सूचीबद्ध किया जाना चाहिए, जैसा कि मैंने किया था। कुछ नया सीख लिया!

5

क्या आपने जीसीसी को अपनी लाइब्रेरी के पथ (-एल का उपयोग करके) का संकेत दिया है? -एल का उपयोग करके, जीसीसी केवल मानक निर्देशिकाओं में उपलब्ध पुस्तकालयों को लिंक करने में सक्षम होगा।

-L[path] -l[lib] 
+0

हां, संबंधित पुस्तकालय से पहले, प्रत्येक पुस्तकालय के पथ -एल का उपयोग करके प्रदान किए जाते हैं। जीसीसी पुस्तकालय पा सकता है, लेकिन पुस्तकालय के भीतर से बड़ी संख्या में अपरिभाषित संदर्भ त्रुटियों को देता है। – Nairou

1

कारण ऐतिहासिक है। "Ar" टूल मूल रूप से पीडीपी 11 यूनिक्स पर फ़ाइल संग्रह उपकरण था, हालांकि इसे बाद में उस उद्देश्य के लिए पूरी तरह से "tar" द्वारा प्रतिस्थापित किया गया था। यह एक पैकेज में फाइलें (ऑब्जेक्ट फाइलें, इस मामले में) स्टोर करता है। और लिंकर के उपयोग के लिए प्रतीक तालिका वाला एक अलग एक्सटेंशन है। यह संभव है अगर आप संग्रह में फ़ाइलों को मैन्युअल रूप से प्रबंधित कर रहे हैं कि प्रतीक तालिका पुरानी हो सकती है।

संक्षिप्त उत्तर यह है कि आप प्रतीक तालिका को फिर से बनाने के लिए किसी भी संग्रह पर "ranlib" टूल का उपयोग कर सकते हैं। उसकी कोशिश करो। अधिक व्यापक रूप से, यह पता लगाने की कोशिश करें कि भ्रष्ट पुस्तकालय कहां से आ रहे हैं और इसे ठीक कर सकते हैं।

+2

मुझे लगता है कि ओपी का मतलब है * लाइब्रेरी के खिलाफ लिंक * लाइब्रेरी नहीं। – ams

5

एक स्थिर पुस्तकालय को जोड़ने का सही तरीका -l का उपयोग कर रहा है, लेकिन यह केवल तभी काम करता है जब लाइब्रेरी खोज पथ पर पाई जा सके। यदि ऐसा नहीं है तो आप -L का उपयोग करके सूची में निर्देशिका जोड़ सकते हैं या नाम के अनुसार फ़ाइल नाम दे सकते हैं, जैसा कि आप कहते हैं।

साझा पुस्तकालयों के लिए भी यही सच है, वास्तव में, हालांकि वे शायद अधिक पाए जाने की संभावना है।