سؤال

وربما هذا هو السؤال المشترك. في الواقع أعتقد أنني طلبت منها منذ سنوات ... ولكن لا يمكنني أن أتذكر الجواب.

والمشكلة هي: لدي مشروع الذي يتكون من 6 ملفات المصدر. كل منهم ما لا يزيد عن 200 خط من التعليمات البرمجية. ويستخدم العديد من حاويات STL، stdlib.h وiostream. الآن تنفيذ حوالي 800KB في حجم .... اعتقد انني لا ينبغي ربط ثابت المكتبات. كيفية القيام بذلك مع دول مجلس التعاون الخليجي؟ وفي الكسوف CDT؟

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

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

المحلول

إذا كنت تعطي ز ++ أسماء مكتبة ديناميكية، وعدم تمرير علامة -static، فإنه ينبغي أن تصل بشكل حيوي.

للحد من حجم، هل يمكن بالطبع strip ثنائي، وتمرير -Os (تحسين لحجم) علم الأمثل لg++.

نصائح أخرى

وشيء واحد هو أن نتذكر أن استخدام نتائج STL في وجود هذا الرمز الإضافي في تنفيذ الخاص بك حتى لو كنت ربط حيوي مع مكتبة C ++. هذا هو بحكم كون STL حفنة من قوالب التي لم يتم جمعها في الواقع حتى تكتب وترجمة التعليمات البرمجية. منذ المكتبة لا يمكن توقع ما يمكن أن تخزن في وعاء، وليس هناك طريقة للمكتبة لاحتواء بالفعل رمز للأن استخدام معين من الحاوية. الشيء نفسه ينطبق مع خوارزميات وكل شيء آخر في المحكمة الخاصة بلبنان.

وأنا لا أقول هذا بالتأكيد سبب للتنفيذ الخاص بك هو لذلك أكبر بكثير مما كنت تتوقع. ولكن قد يكون عاملا.

والكسوف يجب ربط حيوي افتراضيا، إلا إذا قمت بتعيين العلم ثابت على رابط في MAKEFILE الخاص بك.

في استجابة للعدل:

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

والقابل للتنفيذ يجب أن تحتوي على أكثر من مجرد التعليمات البرمجية.

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

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

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

والسؤال الحقيقي هو لماذا هذه المسألة ؟ 800KB لا يزال تناسبها بسهولة على قرص مرن! الأكثر من هذا هو تكلفة لمرة واحدة. وهذا لا يعني أنه إذا كنت أكتب مرتين كرمز الكثير، وسوف يستغرق ما يصل 1600KB. على الأرجح، وسوف يستغرق 810KB أو شيء من هذا القبيل.

لا تقلق تكاليف بدء التشغيل حول لمرة واحدة.

استخدم -O3 والأعلام -s لإنتاج ثنائي الأكثر الأمثل. انظر أيضا هذا صلة للحصول على بعض مزيد من المعلومات.

إذا كنت بناء ويندوز، والنظر في استخدام مترجم مايكروسوفت. وتنتج دائما أصغر ثنائي في هذا النظام الأساسي.

وحجم النتائج عادة في مكتبات ثابت يتم ربط في التطبيق الخاص بك.

ويمكنك تقليل حجم الثنائية المترجمة من خلال تجميع لإطلاق سراح النسخ، مع تحسينات في حجم ثنائي.

وهناك مصدر آخر للحجم قابل للتنفيذ والمكتبات. قلت انك لا تستخدم المكتبات الخارجية، باستثناء STD، لذلك أعتقد أنك بما في ذلك C وقت التشغيل مع تنفيذ الخاص بك، أي ربط بشكل ثابت. حتى تحقق لربط حيوي.

وIMO يجب أن لا تقلق حقا عن ذلك، ولكن إذا كنت بجنون العظمة حقا، والتحقق من هذا: أصغر ELF إلى x86 مرحبا العالم

واستخدام Visual C ++ 6.0 دعمت مع ويندوز 95 إلى ويندوز 7. ويمكن تجميعها ومنصات إلى x86 ولكن فقط من أجل Windows. حتى إذا كنت من مستخدمي ويندوز فقط العصا مع ويندوز المجمعين أخرى من دول مجلس التعاون الخليجي وهو actually.most SUX من الناس الذين يقولون البصرية C ++ هو سبب SUX أنهم مكافحة Microsofters. تذكر أيضا استخدام "البصرية C ++ 6.0" إذا كنت تستخدم أحد أحدث وربما كنت لا يمكن تشغيل الملفات على نظام التشغيل Windows 95. لقد اختبرت كل تلك الأشياء وهذا هو السبب قلت. تنتج دول مجلس التعاون الخليجي أكبر ثنائيات، ولكن مرئي C ++ لا يمكن إنتل مترجم استخدامها لإنقاذ أكثر من 30٪ من مساحة ولكنه يتطلب معالج انتل ما لم الأداء سيكون الرهيبة. شيء آخر ش بحاجة إلى أن نتذكر هو عندما ش استخدام قوالب وإن كنت أرى خطوط صغيرة عند يجمع سيتم توسيع هذه المهام وبالتالي فإن النتيجة هي جعل ثنائيات أكبر. إذا كنت بحاجة إلى ثنائيات أصغر أقترح هو في الواقع تستخدم الانتقال إلى C سبب C على نطاق واسع ولكن ليس OO انفاكت C هو سهل الاستخدام من C ++ هذا لا معنى ثم C ++ سبيل المثال

ومحكمة << "مرحبا العالم" << ENDL. printf ( "٪ ق"، "مرحبا العالم")؛

والثاني للمرء أن يقول مجال الطباعة٪ الصورة يعني قمت بكتابة سلسلة لذلك فمن السهل. : P

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