فرق الحجم بين مكتبة ثابتة وديناميكية (تصحيح) وتأثير على exe النهائي

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

سؤال

لم أضع الكثير من التفكير في الفرق بين المكتبة الثابتة ومكتبة ديناميكية حتى قمت بتنزيل مكتبات Boost التي تم بناؤها مسبقًا اليوم. لقد وجدت أن المكتبات الثابتة للزيادة أكبر بكثير من المكتبات الديناميكية.

على سبيل المثال ، مكتبة Debug Multi-Throwder Boost Wave Static هي المكتبة الثابتة 97.7 mb في الحجم في حين أن المكتبة نفسها ، ولكن الديناميكية ، هي فقط 1.4 mb في الحجم (بما في ذلك مكتبة الاستيراد و DLL)! هذا هو الفارق الهائل. لماذا هذا؟

السؤال الثاني ، إذا ارتبطت بشكل ثابت ، دعنا نقول ، wave مكتبة. هل هذا يعني أن البالون القابل للتنفيذ الخاص بي سوف يكون في الحجم إلى أكثر من 97.7 mb?

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

المحلول

المكتبات الثابتة لديها معلومات رمز التصحيح الكامل فيها. بالنسبة إلى DLL ، ستكون المعلومات في ملفات .pdb (والتي أفترض أنها ستكون متشابهة في الحجم مع libs الثابتة).

عند الارتباط بـ LIB الثابت ، لن يتم نسخ معلومات الرمز إلى .exe - سيتم وضعها في ملف .pdb (إذا تم تكوين إنشاءك لإنشاء ملف .pdb). لا يحتاج ملف .pdb إلى توزيعه باستخدام .exe ، سواء تم إنشاء .pdb أم لا.

في تنزيل المكتبة المدمجة مسبقًا أحصل عليه من BOOSTPRO.com ، لا أحصل على ملفات .pdb لـ Boost DLLs التي يقدمونها. إذا قمت بإنشاء DLLS بنفسك ، فمن المحتمل أن تحصل على ملفات .pdb (على الرغم من أنك قد تضطر إلى تعيين بعض خيار التكوين ، الذي ليس لدي أي فكرة عن التفاصيل).


تحديث:

يبدو أنني قد أكون مخطئًا في الحصول على ملفات .pdb بسهولة لـ Boost DLLs. من عند http://comments.gmane.org/gmane.comp.lib.boost.build/23246:

> Is there an additional option that I can pass on the command line to
> have the (correctly generated) PDB files also copied into the stage
> directory?

ليس في هذا الوقت. يمكنك الاختراق فقط tools/build/v2/tools/package.jam لإضافة <install-type>PDB في كل مكان <install-type>SHARED_LIB أو <install-type>STATIC_LIB مكتوب الآن.

نصائح أخرى

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

من المؤكد أن المكتبات الثابتة تجعل Exe أكبر ، لكنني أفضل ذلك دائمًا. ثم لا داعي للقلق بشأن المكتبات المفقودة أو غير المتوافقة في وقت التشغيل. (أو على الأقل ، أقوم بتقليل فرص هذا.)

نظرًا لأن المكتبات الثابتة لا تحتوي على بيانات ثنائية نهائية ، بل المعلومات اللازمة لربط Linker ، قد تكون هذه المعلومات أكبر من الثنائيات المصممة.

عند استخدام بعض الوظائف المحددة في ملف الرأس في ملف CPP ، يضع برنامج التحويل البرمجي رمزه (إما خطوط ، أو يضيف ببساطة) إلى ملف الكائن الناتج. هذا يعني أنه سيكون هناك الكثير من التكرارات. إنها مهمة Linker لدمجها ، لذا تنتظر Library الثابتة أن يتم تقليل Linker :)

عادةً ما يكون حجم التنفيذ القابل للتنفيذ أكبر مع المكتبات الثابتة ، ولكن حجم التنفيذ القابل للتنفيذ مع المكتبات الديناميكية عادة ما يكون أصغر. يتم ربط DLL و EXE بشكل منفصل ، لذلك لا يمكن لـ Linker معرفة الوظائف المطلوبة في DLL والتي يمكن طرحها. في حالة المكتبة الثابتة ، فإن Linker لديها مثل هذه المعلومات ويمكنها فقط أخذ ملفات OBJ التي يتم استخدامها.

تحتوي مكتبة Debug Static على معلومات التصحيح ، والتي تشرح الفرق الهائل في الحجم.

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