2009-08-22 30 views
5

जब मैं आमतौर पर तृतीय पक्ष (गैर मानक) सी ++ पुस्तकालयों से कोड (हेडर शामिल) का उपयोग करता हूं, तो पूर्व-निर्मित बाइनरी फ़ाइल मेरे निष्पादन योग्य लक्ष्य निष्पादन योग्य (या इसमें शामिल) से जुड़ी होती है, लेकिन सी ++ मानक के साथ क्या होता है लाइब्रेरी ?, जहां तक ​​मैंने देखा है मुझे एक ऐसे पुस्तकालय को शिप करने की ज़रूरत नहीं है जो केवल सी ++ मानक पुस्तकालय से कोड का उपयोग करे, इस प्रकार कोड को स्थिर रूप से लिंक किया गया है और निष्पादन योग्य में शामिल किया गया है?सी ++ मानक पुस्तकालय मेरे आवेदन से कैसे जुड़ा हुआ है?

उत्तर

11

नहीं, डिफ़ॉल्ट रूप से मानक पुस्तकालय रनटाइम पर गतिशील रूप से जुड़े होते हैं।

गतिशील लोडर चलाने पर गतिशील पुस्तकालयों के लिए कुछ मानक स्थानों को देखेंगे यदि यह पाता है और अन्यथा चलाता है तो एप्लिकेशन छोड़ देता है।

यूनिक्स सिस्टम पर:
/usr/lib: के लिए देखो: libstdC++ *

विंडोज पर:
c: \ windows \ system32 देखने के लिए: msvcrt.dll

वहाँ भी एक जोड़े हैं पर्यावरण चर के जो खोज पथ को प्रभावित कर सकते हैं। डॉपन के लिए अपने प्लेटफ़ॉर्म मैन पेज को देखें कि वे क्या हैं। आपको जो कुछ भी चाहिए वह आपके प्लेटफ़ॉर्म पर डलोपेन के लिए मैन पेजों में होना चाहिए।

अधिकांश प्रणालियों में इन libs उचित स्थानों में हैं और स्वचालित रूप से पाए जाएंगे।
बाकी एसटीएल अतिरिक्त साझा lib निर्भरताओं को पेश नहीं करेगा।

+2

निर्देशिका 'c: \ windows \ system32' है। कम से कम वह जगह है जहां विजुअल स्टूडियो के रनटाइम्स रखा जाता है। मुझे लगता है कि हालांकि उन्हें MinGW लिंक नहीं हैं। – avakar

+3

और उसमें जोड़ने के लिए, mingw आपके ऐप को मानक सी ++ लाइब्रेरी को स्थिर रूप से लिंक करता है। – nos

+4

यह उत्तर पूरी तरह से सही नहीं है। libstdC++ MSVCRT.DLL जैसा नहीं है। उत्तरार्द्ध * सी * लाइब्रेरी है, पूर्व * सी ++ * लाइब्रेरी है। यह सच है कि MinGW द्वारा उत्पादित हर बाइनरी MSVCRT.dll पर निर्भर करेगी, लेकिन उस प्रश्न के साथ वास्तव में कुछ भी नहीं है जो पूछा गया था। जैसा कि मैंने नीचे बताया है, और जैसा कि पिछली टिप्पणी में nos बताता है, libstdC++ लाइब्रेरी डिफ़ॉल्ट रूप से आपके निष्पादन योग्य में स्थिर रूप से जुड़ी हुई है। –

1

इनमें से अधिकांश शीर्ष लेख फ़ाइलों में हैं, क्योंकि यह बहुत तेज़ है। बहुत कम libstdc++.so (iostream, यह हो सकता है, मुझे लगता है)।

+2

एसटीएल ज्यादातर हेडर फाइलें हैं। मानक पुस्तकालय में अन्य चीजें शामिल हैं। –

+0

सभी सी ++ libstdC++ की आवश्यकता है। मानक में आवश्यक कुछ आवश्यक कार्य हैं। –

3

मिनजीडब्ल्यू सी ++ प्रोग्राम के लिए केवल मूल रन-टाइम निर्भरता MSVCRT.DLL पर है। अन्य निर्भरता इस बात पर निर्भर करती हैं कि आपका प्रोग्राम वास्तव में क्या करता है - उदाहरण के लिए, यदि यह ओडीबीसी डेटाबेस कनेक्टिविटी का उपयोग करता है, तो यह ओडीबीसी 32. डीएलएल (और शायद कुछ अन्य विंडोज़ डीएलएल) पर निर्भर करेगा। हालांकि, एक मिनीजीडब्ल्यू सी ++ प्रोग्राम में std :: string या std :: vector जैसे वर्गों का उपयोग करने से नई गतिशील लाइब्रेरी निर्भरताएं लागू नहीं होंगी।

आप गतिशील पुस्तकालय dependancies के बारे में चिंतित हैं, तो उपकरण "निर्भरता वाकर" http://www.dependencywalker.com/

6

पर जाँच हाल MinGW में जीसीसी/जी ++ संस्करणों (4.40) यदि आप इसके बजाय डिफ़ॉल्ट स्थिर से एक साझा dll के खिलाफ लिंक कर सकते हैं फ्लैग-शेर-libstdC++ का उपयोग कर लाइब्रेरी।

लाइब्रेरी के स्थिर संस्करण/mingw/lib/gcc/mingw32/[gcc संस्करण] में स्थित हैं। फ़ाइल का नाम libstdC++ है। ए। MinGW के साथ एक C++ ऐप संकलित करते समय इसे डिफ़ॉल्ट रूप से लिंक किया जाएगा।

+3

MinGW के लिए डिफ़ॉल्ट बदल दिया गया है, कम से कम मेरे सिस्टम पर यह libstdC++ - 6.dll के खिलाफ डिफ़ॉल्ट रूप से लिंक कर रहा है। इसे ध्वज '-स्टैटिक-libstdC++' के साथ अक्षम किया जा सकता है। – rustyx

+0

@rustyx जो जानना अच्छा है। प्रतिबिंबित करने के लिए मेरे उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें (और उत्तर को ऊपर उठाएं ताकि वह शीर्ष पर तैर सके;) –

+0

@rustyx मैंने कोशिश की-static-libstdC++ (और -static-libgcc) और फिर भी मेरा प्रोग्राम अभी भी गतिशील रूप से लिंक करता है mingw libstd *। डीएल पुस्तकालयों। मैं क्रॉस संकलन कर रहा हूँ, कोई विचार क्यों? –

1

सी और सी ++ रनटाइम लाइब्रेरी सामान्य पुस्तकालयों के समान ही जुड़े होते हैं, मुख्य अंतर यह है कि वे आमतौर पर संकलक और लिंकर द्वारा स्वचालित रूप से संकलित और लिंक किए जाते हैं, उन्हें निर्दिष्ट करने की आवश्यकता नहीं होती है।

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

+0

अच्छा जवाब, हालांकि मैं mingw के बारे में बात कर रहा था जो मानक पुस्तकालयों को स्थिर रूप से लिंक करने के लिए होता है ... – Lawand

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