يجب أن أربط وقت تشغيل Visual Studio C بشكل ثابت أو ديناميكيا؟

StackOverflow https://stackoverflow.com/questions/787216

  •  16-09-2019
  •  | 
  •  

سؤال

لقد قرأت الحجج على كلا الجانبين حول ما إذا كان ينبغي على المرء ربط مكتبة وقت التشغيل C بشكل ثابت أو ديناميكيا في مشاريع Visual Studio، وما زلت غير متأكد تماما من التفكير.

يسحب مشروعي في بعض مكتبات الطرف الثالث (بيثون، HDF5، Trilinos، و Microsoft MPI)، كل منها يجب أن يتم بناؤه بنفس مكتبة وقت التشغيل مثل تطبيقي النهائي (خلاف ذلك لا يمكن ربطه معا). عند الارتباط بشكل ثابت، سيحتوي كل من هذه المكتبات على نسخة من وقت تشغيل C. قرأت أن هذا عرضة للتسبب في مشكلات لأن التنفيذ النهائي سوف يحتوي على نسخ متعددة من وقت التشغيل، لا يمكن أن يتفاعل أي منها مع بعضها البعض. ولكن لن يشكو رابط إذا تم تحديد نفس الرموز؟

أرغب في تجنب "DLL HELL"، لكنني قلق بشأن الأخطاء الخبيثة التي قد تنشأ من ربطها القانونية بنسخ متعددة من وقت التشغيل. هل أقرأ الأشياء خاطئة؟

أيضا، أنا أستخدم Visual Studio 2005 وقرأت أن وقت التشغيل Service Pack 1 ليس متوافقا مع الورق. هل هذا يعني أن التطبيق الذي تم بناؤه بدون SP1 لن يعمل على جهاز يحتوي على DLLs المزود بحزمة الخدمة SP1، حتى لو كان لديهم نفس الاسم (مثل msvcr80.dll)؟

هل كانت مفيدة؟

المحلول

الرتبية بشكل ثابت سوف ينفخ كل ما تبذلونه من exes و dlls، ويمكن أن يسبب تعطل (على سبيل المثال. إذا كان التعليمات البرمجية في مكالمات DLL واحدة مجانا () مع مؤشر مخصص بواسطة Maloc () في DLL مختلفة).

يمكنك الحصول على أفضل ما في العالمين من خلال ربط ديناميكيا ونشر DLLs DLLS كجمعيات خاصة. هذا يعني ببساطة وضع نسخة من الدليل المسمى خصيصا يحتوي على DLLS Runtime وائسته بجانب قابل للتنفيذ.

راجع قسم "نشر DLLS مكتبة Visual C ++ كجمعيات خاصة" http://msdn.microsoft.com/en-us/library/ms235291(vs.80).aspx. للحصول على التفاصيل، ولكن في الأساس تطبيقك يبدو وكأنه هذا:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

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

فائدة أخرى هي أن المستخدمين غير المسؤولين يمكنهم تثبيت تطبيقك (ليس في ملفات البرنامج، ولكن في أي مكان آخر) - لا يحتاجون إلى إذن لكتابة الملفات في منطقة Winsxs.

نصائح أخرى

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

هذا هو وظيفة رابط.

... قم بذلك بشكل ثابت ... محاولات إصلاح DLL HELL لم تنجح في ذلك جيدا ... فقط أضف 200K إضافي إلى التثبيت مع الربط الثابت.

لا تحتاج المكتبات الثابتة إلى أن تكون مرتبطة قانونيا بمكتبات ثابتة أخرى. تحتاج فقط إلى ربط جميع المكتبات الثابتة في مشروعك الرئيسي. بهذه الطريقة لن يشتكي المترجم من رموز متعددة.

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