Vc \ lib में मौजूद CRT लिंक लाइब्रेरी के 4 संस्करण हैं:
- libcmt.lib: रिलीज़ बिल्ड (/ MT) के लिए स्थिर CRT लिंक लाइब्रेरी
- libcmtd.lib: डीबग बिल्ड (/ MTd) के लिए स्थिर CRT लिंक लाइब्रेरी
- msvcrt.lib: CRT (/ MD) के रिलीज़ DLL संस्करण के लिए आयात लाइब्रेरी
- msvcrtd.lib: CRT (/ MDd) के डीबग DLL संस्करण के लिए आयात लाइब्रेरी
लिंकर विकल्प, प्रोजेक्ट + गुण, लिंकर, कमांड लाइन को देखें। ध्यान दें कि इन पुस्तकालयों का उल्लेख यहाँ कैसे नहीं किया गया है। लिंकर स्वचालित रूप से यह पता लगाता है कि कंपाइलर द्वारा किस / M स्विच का उपयोग किया गया था और किस .lib को एक #pragma उपयोगकर्ता के प्रश्न के माध्यम से जोड़ा जाना चाहिए। Kinda महत्वपूर्ण, अगर आपको / विकल्प और .lib लिंक के बीच कोई मेल नहीं था, तो आपको रनटाइम त्रुटियों का निदान करने के लिए भयानक लिंक त्रुटियां और कठिन मिलेगा।
जब आप लिंकर को msvcrt.lib और libcmt.lib से लिंक करने के लिए कहा जाता है, तो आपको त्रुटि संदेश दिखाई देगा । जो तब होगा जब आप उस कोड को लिंक करेंगे जो / MT के साथ कोड के साथ संकलित किया गया था जिसे / MD के साथ जोड़ा गया था। सीआरटी का केवल एक ही संस्करण हो सकता है।
/ NODEFAULTLIB लिंक को बताता है कि #pragma टिप्पणी निर्देश को अनदेखा करना जो / MT संकलित कोड से उत्पन्न हुआ था। यह काम कर सकता है, हालांकि अन्य लिंकर त्रुटियों का एक प्रकार असामान्य नहीं है। इरनो जैसी चीजें , जो स्थैतिक CRT संस्करण में एक बाहरी int है, लेकिन DLL संस्करण में एक फ़ंक्शन के लिए मैक्रो-एड है। कई अन्य ऐसे ही हैं।
ठीक है, इस समस्या को सही तरीके से ठीक करें, .obj या .lib फ़ाइल खोजें जो आप लिंक कर रहे हैं जो गलत / एम विकल्प के साथ संकलित की गई थी। यदि आपके पास कोई सुराग नहीं है, तो आप "। / MT" के लिए .obj / .lib फ़ाइलों को grepping करके पा सकते हैं।
Btw: Windows निष्पादक (जैसे version.dll) का अपना कार्य करने के लिए अपना स्वयं का CRT संस्करण होता है। यह c: \ windows \ system32 में स्थित है, आप इसे मज़बूती से अपने कार्यक्रमों के लिए उपयोग नहीं कर सकते, इसके CRT हेडर कहीं भी उपलब्ध नहीं हैं। आपके प्रोग्राम द्वारा प्रयुक्त CRT DLL का एक अलग नाम (जैसे msvcrt90.dll) है।