C रनटाइम लाइब्रेरी क्या है?


157

वास्तव में C रनटाइम लाइब्रेरी क्या है और इसका उपयोग किस लिए किया जाता है? मैं खोज रहा था, एक शैतान की तरह Googling, लेकिन मुझे Microsoft से बेहतर कुछ नहीं मिला: "Microsoft रन-टाइम लाइब्रेरी Microsoft Windows ऑपरेटिंग सिस्टम के लिए प्रोग्रामिंग के लिए दिनचर्या प्रदान करता है। ये दिनचर्या कई सामान्य प्रोग्रामिंग कार्यों को स्वचालित करती है जो कि प्रदान नहीं की जाती हैं। सी और सी ++ भाषाएँ। "

ठीक है, मुझे वह मिलता है, लेकिन उदाहरण के लिए, क्या है libcmt.lib? यह क्या करता है? मैंने सोचा था कि सी मानक पुस्तकालय सी संकलक का एक हिस्सा था। तो libcmt.libwin32 के तहत काम करने के लिए सी मानक पुस्तकालय कार्यों का विंडोज 'कार्यान्वयन है?

जवाबों:


71

हाँ, libcmt Microsoft के संकलक के साथ प्रदान की गई सी मानक लाइब्रेरी का एक (कई में से) कार्यान्वयन है। वे तीन बुनियादी प्रकार के पुस्तकालयों के "डिबग" और "रिलीज़" संस्करण प्रदान करते हैं: एकल-थ्रेडेड (हमेशा स्टैटिकली लिंक्ड), मल्टी-थ्रेडेड स्टैटिकली लिंक्ड , और मल्टी-थ्रेडेड डायनामिकली लिंक्ड (हालाँकि, कंपाइलर वर्जन के आधार पर) उपयोग करना, उनमें से कुछ मौजूद नहीं हो सकता है)।

तो, "libcmt" नाम में, "libc" सी लाइब्रेरी के लिए (अधिक या कम) पारंपरिक नाम है। "एमटी" का अर्थ है "बहु-थ्रेडेड"। एक "डीबग" संस्करण में "libcmtd" देते हुए अंत में एक "d" जोड़ा जाएगा।

जहाँ तक यह कार्य शामिल है, सी मानक (भाग 7, यदि आप देखभाल करते हैं) एक कार्य के एक सेट (होस्टेड) ​​कार्यान्वयन की आपूर्ति को परिभाषित करता है। अधिकांश विक्रेता (Microsoft सहित) विभिन्न अन्य कार्यों को स्वयं जोड़ते हैं (अनुकूलता के लिए, क्षमताओं को प्रदान करने के लिए मानक कार्यों को संबोधित नहीं करते हैं, आदि) ज्यादातर मामलों में, इसमें कुछ "आंतरिक" फ़ंक्शन भी शामिल होंगे जो कंपाइलर द्वारा उपयोग किए जाते हैं लेकिन सामान्य रूप से अंतिम उपयोगकर्ता द्वारा नहीं।

यदि आप "libcmt" (अपने उदाहरण का उपयोग करने के लिए) में फ़ंक्शन की पूरी सूची प्राप्त करना चाहते हैं, तो आप विज़ुअल स्टूडियो कमांड प्रॉम्प्ट में से एक ("विज़ुअल स्टूडियो टूल्स" के तहत, सामान्य रूप से) खोल सकते हैं, उस निर्देशिका पर स्विच करें जहां आपकी लाइब्रेरी थीं स्थापित, और कुछ टाइप करें: lib -list libcmt.libऔर यह उस लाइब्रेरी में सभी ऑब्जेक्ट फ़ाइलों के नामों की एक ( लंबी ) सूची उत्पन्न करेगा । वे हमेशा सीधे कार्यों के नाम के अनुरूप नहीं होते हैं , लेकिन आम तौर पर एक विचार देंगे। यदि आप किसी विशेष ऑब्जेक्ट फ़ाइल को देखना चाहते हैं, तो आप lib -extractउन ऑब्जेक्ट फ़ाइलों में से एक को निकालने के लिए उपयोग कर सकते हैं , फिर dumpbin /symbols <object file name>उस विशेष ऑब्जेक्ट फ़ाइल में कौन से फ़ंक्शन (एस) हैं / खोजने के लिए उपयोग करें।


37
आपने यह नहीं बताया कि "C रनटाइम लाइब्रेरी" क्या है !!
onmyway133

4
@entropy: निश्चित रूप से मुझे लगता है जैसे मैंने किया था, लेकिन संक्षिप्त जवाब यह है कि यह फ़ंक्शन का एक संग्रह है, कई (लेकिन सभी जरूरी नहीं) जिनमें से सी मानक के भाग 7 में निर्दिष्ट हैं।
जेरी कॉफिन

3
इस उत्तर का अर्थ है कि सी लाइब्रेरी कंपाइलर टूलचिन का सिर्फ एक हिस्सा हैं। सही नहीं है।
जिगगंजर

@ जेरीकॉफिन प्रश्न: इसलिए strcpyसी मानक पुस्तकालय से कार्य किया जाएगा, उदाहरण के लिए, क्या यह रनटाइम लाइब्रेरी में लागू है, या क्या यह सामान्य सामान्य कोड में होगा। .c फ़ाइलें?
फ़ोरम्यूलेटर

@forumulator: सामान्य रूप से एक .c फ़ाइल में स्रोत कोड होगा जो मानक पुस्तकालय को उचित रूप से तैयार करने के लिए संकलित हो जाता है (..dll, lib, .a .so, या जो भी सिस्टम आप उपयोग कर रहे हैं, उस पर लागू होता है) ।
जेरी कॉफिन

56

सबसे पहले, हमें समझना चाहिए कि एक रनटाइम लाइब्रेरी क्या है; और सोचें कि इसका क्या मतलब हो सकता है "माइक्रोसॉफ्ट सी रनटाइम लाइब्रेरी"।

देखें: http://en.wikipedia.org/wiki/Runtime_library

मैंने अधिकांश लेख यहाँ पोस्ट किया है क्योंकि यह अद्यतन हो सकता है।

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

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

आमतौर पर रनटाइम लाइब्रेरी ऑपरेटिंग सिस्टम को एक्सेस करके कई कार्यों का एहसास करती है। कई प्रोग्रामिंग भाषाओं में अंतर्निहित कार्य हैं जिन्हें आवश्यक रूप से संकलक में महसूस नहीं किया जाता है, लेकिन रनटाइम लाइब्रेरी में लागू किया जा सकता है। तो रनटाइम लाइब्रेरी और मानक पुस्तकालय के बीच की सीमा संकलक निर्माता तक है। इसलिए एक रनटाइम लाइब्रेरी हमेशा कंपाइलर-विशिष्ट और प्लेटफ़ॉर्म-विशिष्ट होती है।

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


3
मानक पुस्तकालय से अलग तरीके से हाइलाइट किया गया वाक्य पहला संक्षिप्त सटीक उत्तर है जिसे मैंने "सबसे" या "कभी-कभी" के साथ योग्य नहीं देखा है।
nik.shornikov

@ nik.shornikov: ऐसा इसलिए है क्योंकि अन्य विवरण अधिक सटीक होने की कोशिश करते हैं। हालांकि यह सच है कि एक मानक पुस्तकालय आमतौर पर एक कंपाइलर और प्लेटफॉर्म के लिए विशिष्ट होता है, लेकिन यह हमेशा सच नहीं होता है। उदाहरण के लिए, विंडोज़ के लिए मिंगव और इंटेल के सी ++ कंपाइलर दोनों के कम से कम कुछ संस्करणों ने माइक्रोसॉफ्ट के मानक पुस्तकालय का उपयोग स्वयं की आपूर्ति करने के बजाय किया है। इसी तरह, लिनक्स पर क्लैंग अपने लिए एक और इंस्टाल करने के बजाय gcc के मौजूदा इंस्टालेशन में मानक लाइब्रेरी का उपयोग करने के लिए (और अक्सर होता है) स्थापित किया जा सकता है।
जेरी कॉफिन

मैं निश्चित रूप से C और C ++ दोनों मानक पुस्तकालयों के कार्यान्वयन को लिखना संभव हूं जो POSIX का समर्थन करने वाले किसी भी मंच पर पोर्टेबल हैं।
जेरी कॉफिन

20

मैंने बस खुद से यह पूछा और कुछ घंटों के लिए मेरे मस्तिष्क को चोट पहुँचा रहा था। फिर भी कुछ ऐसा नहीं मिला जो वास्तव में एक बिंदु बनाता हो। हर कोई जो किसी विषय पर कुछ लिखता है, वास्तव में "सिखा" नहीं पाता है। यदि आप किसी को पढ़ाना चाहते हैं, तो सबसे बुनियादी भाषा जिसे एक व्यक्ति समझता है, उसे लें, इसलिए उसे किसी विषय को संभालने के दौरान अन्य विषयों की परवाह करने की आवश्यकता नहीं है। इसलिए मैं अपने लिए एक निष्कर्ष पर पहुंचा जो इस सभी अराजकता में अच्छी तरह से फिट बैठता है।

प्रोग्रामिंग भाषा सी में, प्रत्येक प्रोग्राम मुख्य () फ़ंक्शन के साथ शुरू होता है। अन्य भाषाएं उन अन्य कार्यों को परिभाषित कर सकती हैं जहां कार्यक्रम शुरू होता है। लेकिन एक प्रोसेसर मुख्य () को नहीं जानता है। एक प्रोसेसर केवल पूर्वनिर्धारित कमांड जानता है, जिसे "0" और "1" के संयोजन द्वारा दर्शाया गया है।

माइक्रोप्रोसेसर प्रोग्रामिंग में, एक अंतर्निहित ऑपरेटिंग सिस्टम (माइक्रोसॉफ्ट विंडोज, लिनक्स, मैकओएस, ..) नहीं होने पर, आपको प्रोसेसर को स्पष्ट रूप से यह बताने की आवश्यकता है कि प्रोग्रामरकाउंटर (पीसी) सेट करके कहां से शुरू करें कि पुनरावृत्तियां और कूदता है (लूप, फ़ंक्शन कॉल)। प्रोसेसर को ज्ञात आदेश। आपको यह जानना होगा कि रैम कितनी बड़ी है, आपको प्रोग्राम स्टैक (स्थानीय चर) की स्थिति निर्धारित करने की आवश्यकता है, साथ ही हीप की स्थिति (गतिशील चर) और वैश्विक चर (i gues) का स्थान इसे SSER कहा जाता है ?) रैम के भीतर। एक एकल प्रोसेसर एक समय में केवल एक कार्यक्रम को निष्पादित कर सकता है।

Thats जहां ऑपरेटिंग सिस्टम आता है। ऑपरेटिंग सिस्टम खुद एक प्रोग्राम है जो प्रोसेसर पर चलता है। एक प्रोग्राम जो कस्टम कोड के निष्पादन की अनुमति देता है। कार्यक्रमों के निष्पादन कोड (जो रैम में लोड किए जाते हैं) के बीच स्विच करके एक समय में कई प्रोग्राम चलाता है। लेकिन ऑपरेटिंग सिस्टम IS A PROGRAM है, प्रत्येक प्रोग्राम को अलग तरह से लिखा जाता है। बस अपने कस्टम प्रोग्राम के कोड को रैम में डालने से यह नहीं चलेगा, ऑपरेटिंग सिस्टम को यह पता नहीं है। आपको अपने प्रोग्राम को पंजीकृत करने वाले ऑपरेटिंग सिस्टम पर फ़ंक्शन को कॉल करने की आवश्यकता है, ऑपरेटिंग सिस्टम को बताएं कि प्रोग्राम को कितनी मेमोरी की आवश्यकता है, जहां प्रोग्राम में प्रवेश बिंदु स्थित है (सी के मामले में मुख्य () फ़ंक्शन)। और यह वह है जो मुझे निर्देशित करता है कि RuntimeLibrary के भीतर स्थित है, और यह बताता है कि आपको प्रत्येक ऑपरेटिंग सिस्टम के लिए एक विशेष लाइब्रेरी की आवश्यकता क्यों है।

यह भी समझाता है कि यह गतिशील रूप से रनटाइम पर क्यों नहीं जुड़ा हुआ है। Dll फाइलें हैं, भले ही इसे RUNTIMELibrary कहा जाता है। RuntimeLibrary को सांख्यिकीय रूप से लिंक करने की आवश्यकता है, क्योंकि यह आपके प्रोग्राम के स्टार्टअप पर आवश्यक है। RuntimeLibrary आपके कस्टम प्रोग्राम को / से दूसरे प्रोग्राम (ऑपरेटिंग सिस्टम) में RUNTIME पर इंजेक्ट / कनेक्ट करती है। यह वास्तव में कुछ मस्तिष्क च का कारण बनता है ...

निष्कर्ष: RUNTIMELibrary नामकरण में विफल है। हो सकता है कि शुरुआती समय में .dll (रनटाइम पर लिंकिंग) नहीं किया गया हो और अंतर को समझने का मुद्दा बस मौजूद नहीं था। लेकिन अगर यह सच है, तो नाम बुरी तरह से चुना गया है।

RuntimeLibrary के लिए बेहतर नाम हो सकते हैं: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

आशा है कि मुझे यह ठीक लगा, सुधार / विस्तार चीयर्स के लिए।


1
मुझे अब भी विचारधारा नहीं मिलती है। एक प्रोग्राम को रनटाइम पर कुछ क्यों चाहिए? बाइनरी कोड क्यों नहीं चल सकता, 100% अकेले, कुछ भी बिना रनटाइम का समर्थन किए? या दूसरे शब्दों में: क्या यह संभव है कि एक कोड हो जो 100% बिना किसी चीज (ओएस सहित) के चलता हो?
मार्सिओब

5
सिद्धांत रूप में एक प्रोग्राम को RTL की आवश्यकता नहीं होती है। हालाँकि, आपका कार्यक्रम कभी भी अपना परिणाम कैसे प्रदर्शित करेगा या ऑपरेटिंग सिस्टम से कुछ सहयोग के बिना कोई इनपुट या अनुरोध मेमोरी लेगा?
एसएन

16

C एक भाषा है और इसकी परिभाषा में, आपके लिए कोई भी कार्य उपलब्ध होने की आवश्यकता नहीं है। कोई IO, कोई गणित रूटीन इत्यादि। अधिवेशन द्वारा, आपके लिए उपलब्ध दिनचर्या का एक सेट है जिसे आप अपने निष्पादन योग्य में लिंक कर सकते हैं, लेकिन आपको उनका उपयोग करने की आवश्यकता नहीं है। हालाँकि, यह एक ऐसी सामान्य बात है कि ज्यादातर लिंकर्स आपको सी रनटाइम लाइब्रेरी से लिंक करने के लिए नहीं कहते हैं।

ऐसे समय होते हैं जब आप उन्हें नहीं चाहते हैं - उदाहरण के लिए, एम्बेडेड सिस्टम के साथ काम करने में, उदाहरण के लिए, मॉलोक होना अव्यवहारिक हो सकता है। मैं पोस्टस्क्रिप्ट को प्रिंटर में एम्बेड करने पर काम करता था और हमारे पास रनटाइम लाइब्रेरीज़ का अपना सेट था जो एम्बेडेड सिस्टम पर अधिक खुश थे, इसलिए हम "मानक" से परेशान नहीं थे।


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

10

रनटाइम लाइब्रेरी वह लाइब्रेरी है जो आपके द्वारा चलाए जा रहे किसी भी C प्रोग्राम के लिए स्वचालित रूप से संकलित की जाती है। आपके द्वारा उपयोग की जाने वाली लाइब्रेरी का संस्करण आपके कंपाइलर, प्लेटफॉर्म, डीबगिंग विकल्पों और मल्टीथ्रेडिंग विकल्पों पर निर्भर करता है।

रनटाइम पुस्तकालयों के लिए विभिन्न विकल्पों का एक अच्छा विवरण: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

इसमें उन कार्यों को शामिल किया गया है जिन्हें आप सामान्य रूप से कॉल करने के लिए पुस्तकालय की आवश्यकता के बारे में नहीं सोचते हैं:

  • malloc
  • एनम, संरचना
  • एब्स, मि
  • ज़ोर

Microsoft के पास उनके रनटाइम लाइब्रेरी कार्यों की एक अच्छी सूची है:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

कार्यों की सटीक सूची संकलक के आधार पर अलग-अलग होगी, इसलिए iOS के लिए आपको अन्य कार्य जैसे dispatch_async () या NSLog () प्राप्त होंगे।


1
क्या संरचना और एनम वास्तव में एक रनटाइम लाइब्रेरी है?
डीन पी

6

यदि आप C या C ++ से संकलित निष्पादन योग्य पर डिपेंडेंसी वॉकर जैसे उपकरण का उपयोग करते हैं , तो आप देखेंगे कि MSLCRT.DLL पर निर्भर DLL में से एक। यह Microsoft C रनटाइम लाइब्रेरी है। यदि आप DWV के साथ MSVCRT.DLL का और परीक्षण करते हैं, तो आप देखेंगे कि यह वह जगह है जहाँ प्रिंटफ (), पुट (0, मिलता है (), एटोई () आदि जैसे सभी कार्य लाइव हैं।


6
यदि केवल उस निष्पादन योग्य को संकलित करते समय, सी रनटाइम गतिशील रूप से जुड़ा हुआ था। अगर इसे वैधानिक रूप से जोड़ा जाता है, तो निर्भरता वॉकर नॉटिहिंग दिखाएगा
एली

4

मुझे लगता है कि Microsoft की परिभाषा का वास्तव में मतलब है:

मानक सी रन-टाइम लाइब्रेरी का Microsoft कार्यान्वयन प्रदान करता है ...


3

Win32 SDK के साथ सी रन-टाइम लाइब्रेरी के तीन रूप हैं:

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

Microsoft Visual C ++ 32-बिट संस्करण में ये तीन रूप हैं, हालांकि, एक DLL में CRT का नाम MSVCRT.LIB है। DLL पुनर्वितरण योग्य है। इसका नाम VC ++ (यानी MSVCRT10.DLL या MSVCRT20.DLL) के संस्करण पर निर्भर करता है। हालाँकि, ध्यान दें कि Win32s पर MSVCRT10.DLL का समर्थन नहीं किया गया है, जबकि CRTDLL.LIB को S32 पर समर्थित है। MSVCRT20.DLL दो संस्करणों में आता है: एक Windows NT के लिए और दूसरा Win32s के लिए।

देखें: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12/y=9

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.