سؤال

في Visual Studio، هناك إشارات COMPALE / MD و / MT والتي تتيح لك اختيار نوع مكتبة وقت تشغيل C الذي تريده.

أفهم الفرق في التنفيذ، لكنني ما زلت غير متأكد من أي واحد لاستخدامه. ما هي إيجابيات / سلبيات؟

ميزة واحدة ل / MD التي سمعتها، هي أن هذا يسمح لشخص ما بتحديث وقت التشغيل، (مثل مشكلة أمان أمان) وسيستفيد تطبيقي من هذا التحديث. على الرغم من أنه بالنسبة لي، يبدو أن هذا تقريبا مثل غير ميزة: لا أريد أن يغير الناس وقت تشغيل دون السماح لي باختبار الإصدار الجديد!

بعض الأشياء التي أشعر بالفضول عليها:

  • كيف تؤثر هذا على أوقات البناء؟ (يفترض / MT أبطأ قليلا؟)
  • ما هي الآثار الأخرى؟
  • أي واحد يفعل معظم الناس يستخدمون؟
هل كانت مفيدة؟

المحلول

من خلال ربط ديناميكيا مع / MD،

  • أنت تتعرض لتحديثات النظام (للحصول على جيدة أو مريضة)،
  • يمكن أن يكون قابل للتنفيذ أصغر (لأنه لا يحتوي على مكتبة مضمنة في تكنولوجيا المعلومات)
  • أعتقد أنه على الأقل، يتم تقاسم جزء من الكود من DLL بين جميع العمليات التي تستخدمها بنشاط (تقليل المبلغ الإجمالي لاستهلاك ذاكرة الوصول العشوائي).

لقد وجدت أيضا أنه في الممارسة العملية، عند العمل مع مكتبات ثنائية صغيرة مرتبطة ثابتة فقط تم بناؤها بخيارات تشغيل مختلفة، / MT في التطبيق الرئيسي يميل إلى التسبب في تعارضات في كثير من الأحيان أكثر من / MD (لأنك سوف يركض في مشكلة إذا كان وقت تشغيل C مرتبطا قانونيا عدة مرات، خاصة إذا كانت إصدارات مختلفة).

نصائح أخرى

إذا كنت تستخدم DLLS، يجب أن تذهب إلى CRT مرتبطة ديناميكيا (/ MD).

إذا كنت تستخدم CRT الديناميكي الخاص بك. exe وجميع .dlls، فسيشارك جميعا في تطبيق واحد من CRT - مما يعني أنهم سيشاركوا جميعا كومة CRT واحدة وذاكرة مخصصة في واحد .EXE / .dll اخر.

إذا كنت تستخدم CRT ثابت لك. exe الخاص بك وجميع .dlls، فسيحصلون جميعا على نسخة منفصلة من CRT - مما يعني أنهم سيستخدمون جميعا كومة CRT الخاصة بهم حتى يتم تحرير الذاكرة في نفس الوحدة تم تخصيصها. ستعاني أيضا من Code Bloat (نسخ متعددة من CRT) وتأثير الزمن الزائد (كل كومة تخصص الذاكرة من نظام التشغيل لتتبع حالتها، والمرفقات العامة يمكن أن تكون ملحوظة).

أعتقد أن الافتراضي للمشاريع التي بنيت من خلال Visual Studio هي / MD.

إذا كنت تستخدم / mt، فلن يعتمد قابلة للتنفيذ على DLL قيد الحاضر على النظام المستهدف. إذا كنت تتغلب على هذا في برنامج مثبت، فربما لن تكون مشكلة ويمكنك الذهاب في كلتا الحالتين.

يمكنني استخدام / MT بنفسي، حتى أتمكن من تجاهل فوضى DLL بأكملها.

PS كما السيد فويت يشير إلى أنه من الأهمية بمكان أن تكون متسقة. إذا كنت تربط مع المكتبات الأخرى، فأنت بحاجة إلى استخدام نفس الخيار الذي يقومون به. إذا كنت تستخدم DLL لجهة خارجية، فمن المؤكد أنه ستحتاج إلى استخدام إصدار DLL من مكتبة وقت التشغيل.

أفضل الارتباط بشكل ثابت مع / mt.

على الرغم من أنك تحصل على ملف قابل للتنفيذ أصغر مع / MD، لا يزال يتعين عليك شحن مجموعة من DLL للتأكد من أن المستخدم يحصل على الإصدار المناسب لتشغيل البرنامج الخاص بك. وفي النهاية سيكون برنامج المثبت أكبر من عند ربط / MT.

ما هو أسوأ من الأسوأ، إذا اخترت وضع مكتبات وقت التشغيل في دليل Windows، في أقرب وقت أو في وقت لاحق، سيقوم المستخدم بتثبيت تطبيق جديد مع مكتبات مختلفة، مع أي حظ سيء، كسر التطبيق الخاص بك.

المشكلة التي سترشحها مع / MD هي أن الإصدار المستهدف من CRT قد لا يكون على جهاز المستخدمين الخاص بك (خاصة إذا كنت تستخدم أحدث إصدار من Visual Studio والمستخدم لديه نظام تشغيل أقدم).

في هذه الحالة، يجب عليك معرفة كيفية الحصول على الإصدار الصحيح على جهازهم.

من http://msdn.microsoft.com/en-us/library/2kzt1wy3(vs.71).aspx.:

/ MT يحدد _mt بحيث يتم تحديد إصدارات متعددة محددة من إجراءات وقت التشغيل من ملفات الرأس القياسية (.h). يؤدي هذا الخيار أيضا إلى وضع برنامج التحويل البرمجي اسم المكتبة libcmt.lib في ملف .obj بحيث يستخدم الرابط libcmt.lib لحل الرموز الخارجية. مطلوب إما / MT أو / MD (أو معادلات التصحيح / MTD / MTD) لإنشاء برامج متعددة المراحل.

/ MD يحدد _mt و _dll بحيث يتم تحديد كلا من إصدارات Multithread- و DLL من إجراءات وقت التشغيل من ملفات .h القياسية. يؤدي هذا الخيار أيضا إلى وضع مترجم اسم المكتبة msvcrt.lib في ملف .obj.

ترتبط التطبيقات التي تم تجميعها مع هذا الخيار بشكل ثابت ب MSVCRT.LIB. توفر هذه المكتبة طبقة من التعليمات البرمجية التي تسمح رابط بحل المراجع الخارجية. يتم احتواء رمز العمل الفعلي في msvcr71.dll، والذي يجب أن يكون متاحا في وقت التشغيل للتطبيقات المرتبطة MSVCRT.LIB.

عند استخدام MD مع _static_cpplib المحدد (/ d_static_cpplib)، سوف يتسبب في الارتباط التطبيق مع مكتبة C ++ Standard C ++ Standard (libcpmt.lib (libcpmt.lib) بدلا من الإصدار الديناميكي (msvcprt.lib) بينما لا يزال يربط ديناميكيا بالعمل الرئيسي عبر CRT msvcrt.lib.

لذلك إذا قمت بتفسيرها بشكل صحيح بعد ذلك / جبل الروابط ثابتة و / MD. الروابط ديناميكيا.

إذا كنت تقوم ببناء قابل للتنفيذ يستخدم DLLs أو Libs الأخرى من الخيار / MD مفضلة لأن كل هذه الطريقة ستظل جميع المكونات مشاركة نفس المكتبة. بالطبع يجب أن يتطابق هذا الخيار لجميع الوحدات النمطية المعنية أي DLL / LIB / EXE.

إذا كان قابل للتنفيذ لا يستخدم أي lib أو dll من مكالمة أي شخص. الفرق ليس كثيرا الآن لأن جوانب المشاركة ليست قيد اللعب.

لذلك ربما يمكنك بدء تشغيل التطبيق مع / MT نظرا لعدم وجود سبب مقنع خلاف ذلك ولكن عندما حان الوقت لإضافة ليب أو DLL، يمكنك تغييره إلى / MD مع ذلك من Lib / DLL وهو سهل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top