क्या मुझे / MD या / MT के साथ संकलन करना चाहिए?


127

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

मैं कार्यान्वयन में अंतर को समझता हूं, लेकिन मुझे अभी भी यकीन नहीं है कि किसका उपयोग करना है। पेशेवरों / विपक्ष क्या हैं?

मैंने सुना है कि / एमडी करने के लिए एक फायदा यह है कि यह किसी को रनटाइम अपडेट करने की अनुमति देता है, (जैसे शायद एक सुरक्षा समस्या पैच) और मेरे ऐप को इस अपडेट से लाभ होगा। हालांकि मेरे लिए, यह लगभग एक गैर-सुविधा की तरह लगता है: मैं नहीं चाहता कि लोग मेरे रनटाइम को बदले बिना मुझे नए संस्करण के खिलाफ परीक्षण करने की अनुमति दें!

कुछ चीजें जिनके बारे में मैं उत्सुक हूं:

  • यह निर्माण समय को कैसे प्रभावित करेगा? (संभवतः / एमटी थोड़ा धीमा है?)
  • अन्य निहितार्थ क्या हैं?
  • ज्यादातर लोग किसका उपयोग करते हैं?

1
अधिक जानकारी और सुझाव मिल सकते हैं: stackoverflow.com/questions/787216
Weidenrinde

जवाबों:


87

गतिशील रूप से / MD के साथ लिंक करके,

  • आप सिस्टम अपडेट (अच्छे या बीमार के लिए) के संपर्क में हैं,
  • आपका निष्पादन योग्य छोटा हो सकता है (क्योंकि इसमें पुस्तकालय शामिल नहीं है), और
  • मेरा मानना ​​है कि कम से कम एक DLL का कोड खंड उन सभी प्रक्रियाओं के बीच साझा किया जाता है जो सक्रिय रूप से इसका उपयोग कर रहे हैं (रैम की कुल खपत को कम करते हुए)।

मैंने यह भी पाया है कि व्यवहार में, जब स्टेटिकली लिंक्ड 3-पार्टी बाइनरी-ओनली लाइब्रेरी के साथ काम करते हैं, जो कि अलग-अलग रनटाइम विकल्पों के साथ बनाया गया है, / मुख्य एप्लिकेशन में एमटी / एमडी की तुलना में अधिक बार संघर्ष का कारण बनता है (क्योंकि आप अगर सी रनटाइम कई बार वैधानिक रूप से जुड़ा होता है, खासकर (अगर वे अलग-अलग संस्करण हैं) तो मुश्किल में पड़ेंगे।


11
सिस्टम अपडेट बिट कुछ हद तक SxS द्वारा कम किया जाता है। EXE को यह घोषित करना है कि वह कौन सा CRT संस्करण चाहता है (चाहता है, नहीं मिलता है - सुरक्षा अपडेट इस पर
हावी

1
क्या इसका मतलब यह है कि अगर मैं एमडी का उपयोग कर संकलन करता हूं और मेरा प्रोग्राम कुछ डीएल पर निर्भर है, तो यह प्रोग्राम विफल हो जाएगा यदि यह कंप्यूटर पर चल रहा है जहां निर्भरता डीएल मौजूद नहीं है?
गर्टन 5

5
@gerrytan: हाँ, आपको यह सुनिश्चित करने की आवश्यकता होगी कि उपयोग किए जा रहे उचित DLL उन सभी कंप्यूटरों पर मौजूद हैं जो सॉफ़्टवेयर चलाना चाहते हैं। इसके लिए विशिष्ट समाधान उपयोगकर्ता को उपयुक्त MSVC पुनर्वितरण पैकेज स्थापित करना है, या एक इंस्टॉलर का उपयोग करना है जो सभी काम करता है।
श्री फूज

@Royi मुझे यकीन नहीं है, लेकिन मुझे लगता है कि /MTरनटाइम में थोड़ा तेज होगा क्योंकि आपके ऐप को हर बार रनटाइम फ़ंक्शन के कार्यान्वयन के लिए खोज करने की आवश्यकता नहीं है, मैं इस स्तर का विशेषज्ञ नहीं हूं, लेकिन मुझे यकीन है कि अधिकांश OS रनटाइम क्रियान्वयन को कैश कर देगा, इसलिए आपका ऐप कैश्ड संस्करण का उपयोग करेगा, इसलिए यह अंतर दूर नहीं होगा, ध्यान दें कि मैंने उल्लेख किया है कि मुझे यकीन नहीं है कि इस टिप्पणी को एक तर्क के रूप में न लें।
अहमद कमाल

34

यदि आप DLL का उपयोग कर रहे हैं तो आपको गतिशील रूप से जुड़े CRT (/ MD) के लिए जाना चाहिए।

यदि आप अपने .exe और सभी .dlls के लिए डायनामिक CRT का उपयोग करते हैं, तो वे सभी CRT का एक ही कार्यान्वयन साझा करेंगे - जिसका अर्थ है कि वे सभी एक CRT हीप और एक .exe / .dll में आवंटित मेमोरी को मुक्त कर सकते हैं। एक और।

यदि आप अपने .exe और सभी .dlls के लिए स्थैतिक CRT का उपयोग करते हैं, तो वे सभी CRT की एक अलग प्रतिलिपि प्राप्त करेंगे - जिसका अर्थ है कि वे सभी अपने स्वयं के CRT हीप का उपयोग करेंगे ताकि स्मृति उसी मॉड्यूल में मुक्त हो जाए जिसमें आवंटित किया गया था। आप कोड ब्लोट (CRT की कई प्रतियां) और अतिरिक्त रनवे ओवरहेड (प्रत्येक हीप ओएस से मेमोरी को अपने राज्य का ट्रैक रखने के लिए आवंटित करते हैं, और ओवरहेड ध्यान देने योग्य हो सकता है) से पीड़ित होंगे।


20

मेरा मानना ​​है कि विज़ुअल स्टूडियो के माध्यम से निर्मित परियोजनाओं के लिए डिफ़ॉल्ट / एमडी है।

यदि आप / MT का उपयोग करते हैं, तो आपका निष्पादन योग्य लक्ष्य प्रणाली पर मौजूद DLL पर निर्भर नहीं करेगा। यदि आप इसे इंस्टॉलर में लपेट रहे हैं, तो यह संभवतः एक मुद्दा नहीं होगा और आप किसी भी तरह से जा सकते हैं।

मैं स्वयं / MT का उपयोग करता हूं, ताकि मैं पूरे DLL गड़बड़ को अनदेखा कर सकूं।

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


14

मैं स्टेटिक रूप से / MT से लिंक करना पसंद करता हूं।

भले ही आपको / MD के साथ एक छोटा निष्पादन योग्य मिलता है, फिर भी आपको यह सुनिश्चित करने के लिए DLL का एक गुच्छा शिप करना होगा कि उपयोगकर्ता को आपके प्रोग्राम को चलाने के लिए सही संस्करण मिले। और अंत में आपके इंस्टॉलर को / MT से लिंक करते समय BIGGER होने वाला है।

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


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

1
मैं पूरी तरह सहमत हूं कि यह एक बुरा विचार है। हालांकि कुछ लोग ऐसा करते हैं, इसलिए मैं वर्णन कर रहा था कि यह एक अच्छा विचार क्यों नहीं है।
एड्रियन ग्रिगोर

@ AdrianGrigore क्यों विभिन्न पुस्तकालयों के साथ एक नया आवेदन आप आवेदन में एक विराम का कारण होगा? यदि आप / एमडी लिंकेज का उपयोग करते हैं, तो आप सिर्फ पुस्तकालयों के नए संस्करणों को लोड करना शुरू करेंगे?
rturrado

4
@rturrado: काफी नहीं। अपने शीर्ष पर अन्य एप्लिकेशन इंस्टॉल करने से पुराने संस्करणों के साथ आपके dll को अधिलेखित किया जा सकता है। नए संस्करण चले जाएंगे। इसे आमतौर पर "dll नरक" के रूप में जाना जाता है, en.wikipedia.org/wiki/DLL_Hell
एड्रियन ग्रिगोर सेप

1
Microsoft ने विजुअल स्टूडियो 2010 में WinSxS को छोड़ दिया - रनटाइम लाइब्रेरी अब या तो निजी रूप से या सिस्टम 32 ( msdn.microsoft.com/en-us/library/vstudio/dd293574.aspx ) में तैनात हैं ।
बीकानेर

8

आपके / MD के साथ चलने वाली समस्या यह है कि CRT का लक्ष्य संस्करण आपके उपयोगकर्ता मशीन पर नहीं हो सकता है (खासकर यदि आप Visual Studio के नवीनतम संस्करण का उपयोग कर रहे हैं और उपयोगकर्ता के पास पुराना ऑपरेटिंग सिस्टम है)।

उस स्थिति में आपको यह पता लगाना होगा कि उनकी मशीन पर सही संस्करण कैसे प्राप्त करें।


7

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

/ MT परिभाषित _MT ताकि रन-टाइम रूटीन के बहु-विशिष्ट संस्करण मानक हेडर (-h) फ़ाइलों से चुने जाते हैं। यह विकल्प संकलक को लाइब्रेरी नाम LIBCMT.lib को .obj फ़ाइल में रखने का कारण बनता है ताकि लिंकर बाहरी प्रतीकों को हल करने के लिए LIBCMT.lib का उपयोग करेगा। मल्टीथ्रेडेड प्रोग्राम बनाने के लिए या तो / MT / / MD (या उनके डिबग समकक्ष / MTd या / MDd) की आवश्यकता होती है।

/ MD _MT और _DLL को परिभाषित करता है ताकि रन-टाइम रूटीन के मल्टीथ्रेड- और DLL-विशिष्ट दोनों संस्करणों को मानक .h फ़ाइलों से चुना जाए। यह विकल्प संकलक को पुस्तकालय नाम MSVCRT.lib को .obj फ़ाइल में रखने का कारण बनता है।

इस विकल्प के साथ संकलित अनुप्रयोग सांख्यिकीय रूप से MSVCRT.lib से जुड़े होते हैं। यह लाइब्रेरी कोड की एक परत प्रदान करती है जो लिंकर को बाहरी संदर्भों को हल करने की अनुमति देती है। वास्तविक कार्य कोड MSVCR71.DLL में समाहित है, जो MSVCRT.lib से जुड़े अनुप्रयोगों के लिए रन टाइम पर उपलब्ध होना चाहिए।

जब / MD का उपयोग _STATIC_CPPLIB परिभाषित (/ D_STATIC_CPPLIB) के साथ किया जाता है, तो यह एप्लिकेशन को डायनेमिक संस्करण (msvcprt.lib) के बजाय स्थिर मल्टीथ्रेड स्टैंडर्ड C ++ लाइब्रेरी (libcpmt.lib) के साथ लिंक करने का कारण बनेगा जबकि अभी भी गतिशील रूप से मुख्य CRT के माध्यम से लिंक कर रहा है। msvcrt.lib।

इसलिए अगर मैं इसे सही ढंग से व्याख्या कर रहा हूँ तो / MT लिंक वैधानिक रूप से और / MD लिंक गतिशील रूप से।


सवाल था "मुझे किसका उपयोग करना चाहिए?", यह कोई जवाब नहीं है।
लियोनार्ड इंकरेट

2

यदि आप निष्पादन योग्य निर्माण कर रहे हैं, जो कि / dd / MD विकल्प की तुलना में अन्य dll या lib का उपयोग कर रहा है, क्योंकि उस तरह से सभी घटक समान लाइब्रेरी साझा कर रहे हैं। बेशक यह विकल्प शामिल सभी मॉड्यूल यानी dll / lib / exe के लिए मेल खाना चाहिए।

यदि आपका निष्पादन योग्य किसी भी व्यक्ति की कॉल की तुलना में किसी भी देय या डीएल का उपयोग नहीं करता है। अंतर अभी बहुत ज्यादा नहीं है क्योंकि साझाकरण पहलू खेलने में नहीं है।

तो हो सकता है कि आप एप्लिकेशन को एमटी / एमटी के साथ शुरू कर सकते हैं क्योंकि कोई बाध्यकारी कारण नहीं है, लेकिन जब इसका समय एक देयता या डीएलएल जोड़ने के लिए है, तो आप इसे / एमडी के साथ लिब / डीएल में बदल सकते हैं जो आसान है।

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