2014-04-20 9 views
9

मैं आमतौर पर "लाइब्रेरी के खिलाफ लिंक करने के लिए" शब्द सुनता हूं। मैं कंपाइलर्स के लिए नया हूं और इस प्रकार लिंक कर रहा हूं, इसलिए मैं इसे थोड़ा और समझना चाहता हूं।कुछ के खिलाफ लिंक करने का क्या मतलब है?

लाइब्रेरी के खिलाफ लिंक करने का क्या अर्थ है और ऐसा नहीं करने पर समस्या क्यों होती है?

उत्तर

11

लाइब्रेरी एक "संग्रह" है जिसमें पहले से ही संकलित कोड है। आम तौर पर, आप कुछ कार्यक्षमता का उपयोग करने के लिए तैयार तैयार लाइब्रेरी का उपयोग करना चाहते हैं, जिसे आप स्वयं लागू नहीं करना चाहते हैं (उदा। डीपीओडी जेपीईजी, एक्सएमएल पार्सिंग, आपको जीयूआई विजेट प्रदान करना, आप इसे नाम दें)।

में C और C++

आम तौर पर एक लाइब्रेरी का उपयोग इस प्रकार है: आप #include पुस्तकालय कि समारोह/वर्ग घोषणाओं शामिल के कुछ हेडर - यानी वे वास्तव में प्रदान किए बिना संकलक कि प्रतीकों की जरूरत कहीं का अस्तित्व है, बताओ उनका कोड जब भी आप उनका उपयोग करते हैं, तो संकलक ऑब्जेक्ट फ़ाइल में प्लेसहोल्डर में रखेगा, जो कहता है कि उस कार्य कॉल को लिंक समय पर हल किया जाना चाहिए, जब शेष ऑब्जेक्ट मॉड्यूल उपलब्ध होंगे।

फिर, लिंक करने के समय, आपको वास्तविक पुस्तकालय निर्दिष्ट करना होगा जहां पुस्तकालय के कार्यों के लिए संकलित कोड पाया जाना है; लिंकर तब आपके संकलित कोड को आपके साथ जोड़ देगा और अंतिम निष्पादन योग्य (या, गतिशील पुस्तकालयों के मामले में, यह लोडर पर गतिशील लिंकिंग करने के लिए लोडर के लिए प्रासंगिक जानकारी जोड़ देगा)।

यदि आप निर्दिष्ट नहीं करते हैं कि लाइब्रेरी के साथ लिंक किया जाना है, तो लिंकर के पास अनसुलझे संदर्भ होंगे - यानी यह देखेंगे कि कुछ फ़ंक्शंस घोषित किए गए थे, आपने उन्हें अपने कोड में उपयोग किया था, लेकिन उनका कार्यान्वयन कहीं भी नहीं है मिल गया; यह कुख्यात "अपरिभाषित संदर्भ त्रुटियों" का कारण है।

सूचना है कि यह सभी प्रक्रिया क्या सामान्य रूप से होता है जब आप एक परियोजना है कि कई .cpp फ़ाइलों से बना है संकलित करने के लिए समान होता है: प्रत्येक .cpp स्वतंत्र रूप से (संकलित किया गया है कार्यों केवल प्रोटोटाइप के माध्यम से अन्य लोगों में परिभाषित की जानते हुए भी, आम तौर पर .h में लिखा फाइलें), और अंत में अंतिम निष्पादन योग्य उत्पादन के लिए सबकुछ एक साथ जुड़ा हुआ है।

+0

क्या यह मानक शीर्षलेखों के लिए भी सच है? उदाहरण के लिए, ' 'में केवल घोषणाएं शामिल हैं लेकिन कार्यान्वयन नहीं है? कार्यान्वयन कहां रहता है? – user2030677

+0

यह ज्यादातर वही है, मुख्य अंतर यह है कि आम तौर पर सी ++ संकलक मानक लाइब्रेरी के खिलाफ लिंक करने के लिए लिंकर को स्वचालित रूप से बताता है (जिसमें से अलग-अलग संस्करण हो सकते हैं, जैसे स्थिर/गतिशील रूप से जुड़े, डीबग/अनुकूलित, ..., चुने गए कंपाइलर झंडे के आधार पर)। साथ ही, ध्यान रखें कि कई शीर्षकों में 'इनलाइन' फ़ंक्शंस के लिए कोड होता है (संकलक वास्तव में इनलाइनिंग करने की अनुमति देता है) और टेम्पलेट्स (और यही कारण है कि मानक लाइब्रेरी का अधिकांश एसटीएल भाग केवल हेडर है)। –

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