LNK4098 को हल करना: defaultlib 'MSVCRT' के साथ विरोध


216

यह चेतावनी:

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
  with use of other libs; use /NODEFAULTLIB:library

विजुअल स्टूडियो में एक काफी सामान्य चेतावनी है। मैं इसका सही कारण और इसे संभालने के सही तरीके (यदि बिल्कुल) को समझना चाहूंगा।

इसके साथ संकलित एक डीबग बिल्ड में आता है /MDd। परियोजना खिड़कियों जैसी चीजों से जुड़ी हुई है Version.dllऔर pdh.dllजो स्वयं से जुड़ी हुई है MSVCRT.dll। जाहिर है, मेरे पास इन के डिबग संस्करण नहीं हैं और इन्हें संकलित नहीं किया जा सकता है।

इसलिए मैंने /NODEFAULTLIB:MSVCRTलिंकर कमांड लाइन में जोड़ा और यह वास्तव में चेतावनी को हटा दिया। लेकिन यह वास्तव में क्या करता है? और यह क्यों आवश्यक है?

जवाबों:


273

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) है।


2
इस पोस्ट के लिए धन्यवाद, मैं एक .lib की तलाश में रहा जो अभी भी / MDd का उपयोग कर रहा था और मुझे अंततः एक मिल गया! धन्यवाद, +1
सेक्टेको

64
एक ट्रिक मैंने सिर्फ उन पुस्तकालयों को ट्रैक करने के लिए सीखा है जो गलत सीआरटी पुस्तकालयों में खींच रहे हैं /verbose:lib, अतिरिक्त लिंकर विकल्पों में जोड़ना है। यह आदेश दिखाता है कि .lib फाइलें भरी हुई हैं, जिससे आप यह देख सकते हैं कि गलत को कहां खींचा गया था।
obmarg

1
हंस, यह कितना खतरनाक है? यदि हम इसे ठीक नहीं कर सकते हैं (हम अपने विक्रेता से संकलित परिवाद प्राप्त करते हैं), तो हमें किन परिणामों का सामना करना पड़ सकता है?
इवान निकितिन

3
मुझे @obmarg की टिप्पणी उपयोगी लगी, लेकिन फिर भी यह निश्चित नहीं था कि जब तक मुझे msdn.microsoft.com/en-us/library/aa267384(v=vs.60).aspx नहीं मिला, तब तक वर्बोज़ आउटपुट का उपयोग कैसे किया जाता है , जो वर्बोज़ आउटपुट कहता है केवल आपको लिंक प्रॉब्लम में शामिल सभी रनटाइम लाइब्रेरी बताएं। फिर भी आपको यह पता लगाना होगा कि कौन सा लिंक इनपुट परस्पर विरोधी रनटाइम लाइब्रेरी के साथ संकलित किया गया है।
buzz3791

4
@ buzz3791 / verbose के बजाय / verbose का उपयोग करें: lib। प्रदर्शित जानकारी में पुस्तकालय खोज प्रक्रिया शामिल है और प्रत्येक पुस्तकालय और ऑब्जेक्ट नाम (पूर्ण पथ के साथ), पुस्तकालय से हल किए जा रहे प्रतीक और प्रतीक को संदर्भित करने वाली वस्तुओं की एक सूची को सूचीबद्ध करता है। / क्रिया उन सभी सूचनाओं को प्रदर्शित कर सकती है जिन्हें आपको उस बुरे आदमी को खोजने की आवश्यकता है जो संघर्ष का कारण बनता है।
यांग कुई

46

इसका मतलब है कि एक निर्भर dll एक अलग रन-टाइम लाइब्रेरी के साथ संकलित है ।

प्रोजेक्ट -> गुण -> C / C ++ -> कोड जनरेशन -> रनटाइम लाइब्रेरी

सभी पुस्तकालयों पर जाएं और देखें कि वे उसी तरह संकलित हैं।

इस लिंक में इस त्रुटि के बारे में अधिक:

चेतावनी LNK4098: defaultlib "LIBCD" अन्य परिवादों के उपयोग के साथ संघर्ष करता है


यही त्रुटि का कारण था! पारितोषिक के लिए धन्यवाद।
racachach

1
यह कम अनुभवी प्रोग्रामर के लिए सबसे अच्छा जवाब है।
मेओलिक

32

IMO इस लिंक से Yochai टिमर बहुत अच्छा और प्रासंगिक लेकिन दर्दनाक पढ़ने के लिए गया था। मैंने एक सारांश लिखा।

योचाई, यदि आप कभी भी इसे पढ़ते हैं, तो कृपया नोट को अंत में देखें।


मूल पोस्ट पढ़ने के लिए: LNK4098 चेतावनी: defaultlib "LIBCD" अन्य कामों के उपयोग के साथ संघर्ष करता है

त्रुटि

लिंक: चेतावनी LNK4098: डिफाल्टिब "LIBCD" अन्य कामों के उपयोग के साथ संघर्ष करता है; उपयोग / NODEFAULTLIB: पुस्तकालय

अर्थ

सिस्टम का एक हिस्सा डिबग सूचना (libcd) के साथ एकल थ्रेडेड स्टैंडर्ड (libc) लाइब्रेरी का उपयोग करने के लिए संकलित किया गया था, जो कि स्टेट से जुड़ा हुआ है

जबकि डिबग जानकारी के बिना मल्टी-थ्रेडेड मानक लाइब्रेरी का उपयोग करने के लिए सिस्टम का एक अन्य भाग संकलित किया गया था जो DLL में रहता है और डायनेमिक लिंकिंग का उपयोग करता है

कैसे करें समाधान

  • चेतावनी को नजरअंदाज करें, आखिर यह केवल एक चेतावनी है। हालाँकि, आपके कार्यक्रम में अब एक ही कार्य के कई उदाहरण हैं।

  • लिंकर विकल्प / NODEFAULTLIB: lib का उपयोग करें। यह एक पूर्ण समाधान नहीं है, भले ही आप अपने प्रोग्राम को इस तरह से लिंक करने के लिए प्राप्त कर सकते हैं जब आप चेतावनी के संकेत को अनदेखा कर रहे हैं: कोड को अलग-अलग वातावरणों के लिए संकलित किया गया है, आपके कुछ कोड एकल थ्रेडेड मॉडल के लिए संकलित किए जा सकते हैं जबकि अन्य कोड है मल्टी-थ्रेडेड।

  • [...] अपने सभी पुस्तकालयों के माध्यम से पता लगाएं और सुनिश्चित करें कि उनके पास सही लिंक सेटिंग्स हैं

उत्तरार्द्ध में, जैसा कि मूल पोस्ट में बताया गया है, दो आम समस्याएं पैदा हो सकती हैं:

  • आपके पास एक तृतीय पक्ष पुस्तकालय है जो आपके आवेदन से अलग तरीके से जुड़ा हुआ है।

  • आपके पास आपके कोड में अन्य निर्देश हैं: आमतौर पर यह MFC होता है। यदि आपके सिस्टम में कोई भी मॉड्यूल MFC के विरुद्ध लिंक करता है, तो आपके सभी मॉड्यूल MFC के समान संस्करण के विरुद्ध नाममात्र लिंक होना चाहिए।

उन मामलों के लिए, सुनिश्चित करें कि आप समस्या को समझते हैं और समाधान के बीच निर्णय लेते हैं।


नोट: मैं योचाई टिमर के लिंक के उस सारांश को अपने उत्तर में शामिल करना चाहता था लेकिन चूंकि कुछ लोगों को संपादन की समीक्षा करने में परेशानी होती है, इसलिए मुझे इसे एक अलग उत्तर में लिखना पड़ा। माफ़ करना


7

मुझे यह हर बार मिलता है जब मैं VC ++ में एक एप्लिकेशन बनाना चाहता हूं।

प्रोजेक्ट पर राइट-क्लिक करें, फिर 'कॉन्फ़िगरेशन प्रॉपर्टीज़' के तहत प्रॉपर्टीज़ चुनें C / C ++ | कोड जेनरेशन ', डीबग कॉन्फ़िगरेशन के लिए "मल्टी-थ्रेड डीबग (/ MTd)" का चयन करें।

ध्यान दें कि यह आपके रिलीज़ कॉन्फ़िगरेशन के लिए सेटिंग नहीं बदलता है - आपको उसी स्थान पर जाने और रिलीज़ के लिए "मल्टी-थ्रेडेड (/ MT)" का चयन करने की आवश्यकता होगी।


4

प्रोजेक्ट पर राइट-क्लिक करें, फिर 'कॉन्फ़िगरेशन प्रॉपर्टीज़' के तहत प्रॉपर्टीज़ चुनें लिंकर | इनपुट | विशिष्ट लाइब्रेरी पर ध्यान न दें और msvcrtd.lib लिखें

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