ما الفرق بين .lib و .h و dll في c++ ?


التعليقات

ملفات .h هى مجرد header يدمج كجزء من الكود فى ملف الcpp تماما و كأنك كتبته فى رأس الملف, غرضه تنظيمى ليس أكثر بالاضافة الى امكانية استدعاء هذا الملف (التعريفات فقط) الى الملفات الأخرى فى الكود (استدعاء دالة فى ملف من ملف اخر).

مثلا لنفترض ان ملف file.h يحتوى على

int func();

هو تماما نفسه عندما تضع

int func();

على رأس ملف file.cpp ,

لكن بالطبع فى هذه الحالة كيف سوف تضيف تعريفات file.cpp الى ملف اخر لاستدعاء الدالة func؟

بدون ملفات .h سوف تضطر الى كتابة برنامجك كله فى ملف واحد كبير, و هذا ليس جيدا.

ملفات .lib و ملفات .dll متشابهين الى حد ما, كلاهما ملف بلغة الألة يحتوى على مجموعة من الاجراءات التى يمكن استدعائها.

ملفات .lib تنضم الى الملف النهائى .exe و تصبح جزءا منه.

ملفات .dll تختلف عن ملفات .lib فى كونها لا تنضم الى الexe, بل هى تظل ملف منفصل عنه, و يتم تحميله بواسطة النظام عندما يطلب الexe ذلك.

الفائدة هنا كبيرة, مثلا يمكنك تبديل ملفات .dll بحسب سير البرنامج, كما يمكنك اضافة امكانيات جديدة للبرنامج دون ان تضيف الى الكود الأصلى, ما يسمى بالextensions

كمثال,

لدينا قارىء صور متعددة مثلا, يقرأ ملفات bmp, و jpeg, و gif,

طيب لكى تبرمجه عليك ان تكتب function منفصلة لكل نوع ملفات.

الطريقة الأخرى هى ان تستدعى function واحدة اسمها ReadPicFile() تقوم بارجاع كيفية رسم الصورة بشكل قياسى,

ثم نصنع ثلاثة ملفات dll كل ملف يحتوى على نفس الاجراء RedPicFile لكن التنفيذ بشكل مختلف.

يقوم برنامجك باضافة الext الخاص بالصورة لكل ملف dll ثم يقوم باستدعاءه اوتوماتيكيا,

مثلا ملف .bmp موجود فى الملف readbmp.dll و jpg موجود فى readjpg.dll و هكذا,

سوف يقوم برنامج باضافة امتداد الصورة الى ملف dll و استدعاؤه, ثم استدعاء نفس الدالة كل مرة ReadPicFile,

أين الفائدة هنا؟

لقد اخترعوا نوع جديد هو .png؟ ماذا تفعل؟

بكل بساطة, سوف تضيف معالجة صور .png الى الملف readpng.dll, و هكذا فجأة أصبح برنامجك قادر على قراءة نوع جديد تماما, لقد أضفت قدرة كبيرة الى برنامج دون ان تمس بالنص الأصلى!!

ليس هذا فقط, لنفترض انك قررت ان تفتح لبرنامجك أفاق جديدة عبر امكانية المبرمجين الاخرين اضافة الextensions اليه, فهم قادرين عبر ضوابط معينة الى اضافة تعريف ملفات جديدة فقط عبر كتابة الdll بنفسهم, دون ان يمسوا او يتعرضوا للكود الأصلى.

ملف الheader يتحول الى لغة الألة فهو يحتوى على جزء من الكود.

تعامل مع ملف الheader على انه جزء من الملف المصدرى cpp, هو مجرد شىء تنظيمى و مكان لوضع التعريفات, ملف الهيدر للتعريفات و ملف الcpp للكود نفسه.

ملفات lib و dll كلاهما يتحول الى لغة الألة, و المفاضلة بينهما هى :

  • اذا كنت تريد اعادة استخدام الكود بطريقة أكثر سهولة و سلاسة (من الcopy و الpaste!) و طريقة أكثر تنظيما, أو ايجاد طريقة لفريق من المبرمجين و تقسيم العمل بينهم, و الكود ثابت و لا تحتاج الى ديناميكية فى الاختيار بين الاجراءات (مثل المثال الذى ذكرته), فملف .lib اختيار جيد.

  • اذا كنت تحتاج ما سبق بالاضافة الى ديناميكية اضافة اجراءات و قدرات جديدة لبرنامجك, فالdll خيار مناسب.

ملف الهيدر شىء أخر, هو عبارة عن جزء من الكود و يدمج مع الملف المصدرى .cpp, و حتى الlib و الdll كلاهما قد يحتوى بداخلهما على مئات ملفات ال.h ربما, فهذا شىء و هذا شىء أخر و ليسوا بدلاء.

.lib و .dll يمكن المقارنة بينهما, بينما .h هى شىء أخر تماما.

الاختلاف يكون عندما تريد نشر برنامجك .. لن تستطيع نقل الملفات .h و .lib مع الحزمه لانه في الغالب الطرف الاخر ليس لديه كومبايلر لاعاده بناء برنامجك ..

ستكون مضمنه ضمن البرنامج او يمكنك فصلها في ملف dll

اعتقد هذا سيجاب عن سؤالك

ملفات h. عادةََ ما تحتوي على تعاريف المواد المستخدمة في ملفات c. أو cpp. ، و هي الملفات التي تستعملها في الجملة

" include "anExample.h#

ملفات lib. تؤدي نفس الغرض، و حسب خبرتي ملفات h. و cpp. مستعملة أكثر،

المشكلة في هذه الملفات أنها لابد أن تتضمن مع برنامجك عند التصدير باستعمال linker ، فإذا كانت المكتبة التي تستعملها كبيرة أو ثقيلة الحجم فسينعكس هذا سلباً على برنامجك، كما أن هناك مشكلة في عدم توافر مصدر كود الكثير من المكاتب ( ملفات .h , cpp.) خاصة إن كانت غير مفتوحة المصدر.

لحل هذه المشاكل جاءت فكرة المكاتب الديناميكية Dynamic Libraries (على عكس ملفات lib. cpp. h. و التي تسمى Static Libraries) . هذه المكاتب عبارة عن ملفات مجمعة (compiled files) مثلها مثل .exe ، تقوم بتحميلها على جهاز المستخدم (مثلاً توزيعة .net) و يقوم برنامجك بالارتباط بها و استعمالها من دون إعادة تحميلها وقت التجميع،

المشكلة في مثل هذه الملفات، أنك كمبرمج لاتستطيع ضمان أن جهاز المستخدم يحتوي على المكاتب المناسبة لبرنامجك، مثال مشهور جداً هي توزيعة ال net. و التي لابد أن تحميلها من مايكروسوفت قبل تحميل عدة برامج مثل Matlab أو Photoshop، و المشكلة الأخرى أنها تعتمد بشكل مباشر على نظام التشغيل، فهذه الملفات تلحق ب dll. في نظام ويندوز، بينما أنظمة لينكس تعتمد على التسمية الملحقة بـ so.

1) لا يمكنك استعمال ملفات exe و dll بشكل مباشر على اللينكس، لابد من ترجمة لهذه الملفات بطريقة أو بأخرى ( ليس لي خبرة بهذا الموضوع لكن بحث سريع على جوجل يؤكد أن المشكلة لها حلول مختلفة)

2) عندما تقوم بتجميع البرنامج و استصداره فأنت تقوم بتحويل كل ملفات h , lib , cpp إلى ملف واحد مشفر (bin files) و بهذا تقوم بإخفاء كل السورس كود ببرنامجك،

3) لا، خاصية هذه الملفات (static libraries) أنها تتجمع في مرحلة (linkage) إلى ملف واحد مشفر (bin file) يحتوي على الملفات المجمعة ، وبهذا يكون تحميل الملف الناتج .exe كاف

يوجد برنامج اسمه واين (Wine)يتم تثبيته على لينكس يسمع باستعمال ملفات exe و dll شخصيا لا افضل استعماله.

افضل برامج لينكس 100% (.deb ...)


برمجة

المواضيع والنقاشات المتعلقة بالبرمجة بشكل عام او لغات البرمجة التي لايوجد لها مجتمعات فرعية.

24.6 ألف متابع