2012-10-18 15 views
19

मैं एक्सकोड में सी ++ लाइब्रेरी बनाने की कोशिश कर रहा हूं और मुझे यकीन नहीं है कि सी/सी ++ लाइब्रेरी या एसटीएल सी ++ लाइब्रेरी विकल्प चुनना है या नहीं? मैंने देखा कि STL C++ Library विकल्प आपको स्थिर लाइब्रेरी बनाने और गतिशील लाइब्रेरी बनाने के लिए मजबूर नहीं करता है। हालांकि, C/C++ Library विकल्प आपको स्थिर लाइब्रेरी बनाने के अलावा गतिशील लाइब्रेरी बनाने देता है।एक्सकोड में सी/सी ++ लाइब्रेरी और एसटीएल सी ++ लाइब्रेरी के बीच क्या अंतर है?

इन दो विकल्पों के बीच क्या अंतर है और मुझे प्रत्येक का उपयोग कब करना चाहिए? मैंने विकल्पों के नीचे विवरण पढ़ा लेकिन दुर्भाग्यवश वे बहुत उपयोगी नहीं हैं।

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

enter image description here

enter image description here

+0

libC++ बनाम libstdC++ शायद? – Praetorian

उत्तर

17

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

गतिशील रूप से लोड किए गए पुस्तकालयों के साथ, कोड कहां होगा, यह जानने का कोई तरीका नहीं है, इसलिए जब लाइब्रेरी रन-टाइम पर लोड की जाती है, तो भारित कोड को "बाध्य" करने के लिए प्रदर्शन ओवरहेड की एक निश्चित राशि आवश्यक होती है। अनिवार्य रूप से, लिंकिंग रन-टाइम को स्थगित कर दिया जाता है, यही कारण है कि इसे कभी-कभी "देर से बाध्यकारी" के रूप में भी जाना जाता है।

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

लेकिन बड़े पैमाने पर परियोजनाओं के लिए, कार्यक्षमता का एक टन प्रदान करने वाले ऐप्स में, यह एक ही समय में सभी कार्यक्षमताओं को लोड करने के लिए निषिद्ध और अनावश्यक हो सकता है। गतिशील रूप से लोड करने योग्य पुस्तकालयों का एक सेट प्रदान करना दोनों स्मृति को बचा सकता है और स्टार्ट-अप समय को छोटा कर सकता है। फिर, चूंकि उपयोगकर्ता विशेषताओं तक पहुंचता है, प्रासंगिक कोड लोड होता है, और संभावित रूप से ऐसी विशेषताएं जो थोड़ी देर में उपयोग नहीं की गई हैं उन्हें अनलोड किया जा सकता है।

इसके अतिरिक्त, यदि आप कोड में परिवर्तन करते हैं, तो आप फिर से संकलित करने और फिर से लिंक करने और पूरे निष्पादन योग्य को फिर से वितरित करने के बजाय एक या दो पुस्तकालयों को फिर से वितरित करने में सक्षम हो सकते हैं। और मुझे प्लगइन की संभावना का जिक्र करना चाहिए?

उपरोक्त दो टेम्पलेट्स के बीच अंतर सूक्ष्म हैं। दोनों जीएनयू 99 मानक के अनुसार सी संकलित करते हैं। लेकिन सी/सी ++ लाइब्रेरी टेम्पलेट सी ++/जीएनयू ++ 0 एक्स "मानक" के अनुसार सी ++ संकलित करने के लिए एक्सकोड सेट करता है। बाद में सी ++/जीएनयू ++ 0x को आधिकारिक तौर पर सी ++/जीएनयू ++ 11 के रूप में प्रकाशित किया गया था। दोनों टेम्पलेट्स libC++ का उपयोग करने के लिए डिफ़ॉल्ट हैं, लेकिन एसटीएल सी ++ टेम्पलेट आपको पुराने libstdC++ के बजाय लिंक करने का चयन करने की अनुमति देता है। आप ऐसा क्यों करेंगे? यदि आपका कोड libC++ के खिलाफ लिंक करता है लेकिन आप अन्य पुस्तकालयों के खिलाफ भी लिंक कर रहे हैं जो libstdC++ का संदर्भ देते हैं, और आप विरोधाभासी प्रतीकों में भाग लेते हैं, तो आप इसके बजाय libstdC++ के खिलाफ लिंक करके इसे हल करने में सक्षम हो सकते हैं। एसटीएल सी ++ लाइब्रेरी टेम्पलेट आपको यह अनुरोध करने की अनुमति देता है कि जीएनयू ++ 11 एक्सटेंशन को छोड़कर, सी ++ 11 मानक में कंपाइलर स्टिक, या सी ++/जीएनयू ++ 98 पर वापस जाएं (यदि आपको विरासत कोड संकलित करने की आवश्यकता है, के लिए उदाहरण)।

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