سؤال

ما هي فوائد مكتبة رأس فقط ولماذا تكتبها بهذه الطريقة تعارض وضع التنفيذ في ملف منفصل?

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

المحلول

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

وجود مكتبة رأس فقط يعني أيضا لم يكن لديك ما يدعو للقلق منصات مختلفة حيث يمكن استخدام المكتبة.عند فصل التنفيذ ، عادة ما تقوم بذلك لإخفاء تفاصيل التنفيذ وتوزيع المكتبة كمزيج من الرؤوس والمكتبات (lib, dllأو .so الملفات).هذه بالطبع يجب أن يتم تجميعها لجميع أنظمة التشغيل / الإصدارات المختلفة التي تقدمها الدعم.

يمكنك أيضا توزيع ملفات التنفيذ ، ولكن هذا يعني خطوة إضافية للمستخدم-تجميع مكتبتك قبل استخدامها.

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

نصائح أخرى

فوائد مكتبة الرأس فقط:

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

    عيوب مكتبة رأس فقط:

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

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

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

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

أعرف أن هذا هو موضوع قديم، ولكن لم يذكر أحد واجهات ABI أو مشاكل محمولة محددة. لذلك اعتقدت أنني سوف.

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

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

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

أثناء التحدث عن CRT، يجب ربط مكتبةك ومصدر المستخدم عموما بربط نفس CRT. باستخدام Visual Studio إذا قمت بإنشاء مكتبتك باستخدام CRT متعددة الصدد، ولكن يرتبط المستخدمون مقابل CRT Debug Recug الخاص بك، فسيكون لديك مشكلات ربط لأن مكتبتك قد لا تجد الرموز التي يحتاجها. لا أستطيع أن أتذكر أي وظيفة كانت، ولكن بالنسبة إلى Visual Studio 2015 Microsoft قدمت وظيفة CRT واحدة مضمنة. فجأة كان في الرأس وليس مكتبة CRT حتى المكتبات التي من المتوقع أن تجدها في وقت الارتباط لم تعد يمكن أن تفعله وأخطاء الارتباط التي تم إنشاؤها. وكانت النتيجة أن هذه المكتبات تحتاج إلى إعادة ترجمة مع Visual Studio 2015.

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

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

أساسا أن تكون آمنة فقط الأشياء الوحيدة التي يمكنك تمريرها عبر حدود المكتبة بنيت في أنواع البيانات والبيانات القديمة العادية (POD). من الناحية المثالية، يجب أن يكون أي جراب في الهياكل التي يتم تعريفها في رؤوسك الخاصة ولا تعتمد على أي رؤوس طرف ثالث.

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

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

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

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