C++ التعامل مع المكتبات

مفهوم المكتبات البرمجية

المكتبة ( Library ) عبارة عن ملف يمكن أن يحتوي على كلاسات و دوال جاهزة بمجرد تضمينها في المشروع تصبح قادر على استخدام كل ما هو موجود فيها و كأنها جزء من المشروع. في العادة عندما يجد المطور نفسه دائماً ما يستخدم نفس الكلاسات و الدوال في مشاريعه يقوم بوضعهم بداخل مكتبة واحدة و كلما احتاج إليها يقوم بتضمينها في مشروعه.

الآن, عليك معرفة أنه يوجد نوعين من المكتبات التي يمكن تضمينها في المشروع:

  • مكتبات ثابتة ( Static Libraries ) و يكون امتدادها .lib على نظام ويندوز و .a على نظامي لينكس و ماك.
  • مكتبات ديناميكية ( Dynamic Libraries ) و يكون امتدادها .dll على نظام ويندوز و .so على نظامي لينكس و ماك.

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

الأفضل و الأسهل لك دائماً هو أن تخصص مكان في حاسوبك تضع فيه كل المكتبات التي قد تستخدمها.

أهمية بناء المشروع أو المكتبة

من بداية الدورة و حتى الآن كنا نقوم دائماً النقر على الزر Build and run عندما نريد تشغيله و ليس فقط الزر Run, بمعنى آخر كنا نبني المشروع قبل بنائه.

الصورة التالية تذكرك بأسماء الأزرار التي نستخدمها في برنامج CodeBlocks لبناء و تشغيل المشروع.

المقصود من بناء المشروع هو قيام المترجم بالتأكد من أن كود المشروع لا يوجد فيه أي مشكلة من ناحية كتابة الأوامر (Syntax Error) و من ثم تحويل كل كود المشروع (Compile) لملف تنفيذي إمتداده .exe.

المقصود من تشغيل المشروع, هو تشغيل الملف التنفيذي الذي يمثل البرنامج النهائي الناتج عن عملية بناء المشروع فقط.


الفرق بين الحفظ (Save) و البناء (Build)

حفظ ملفات المشروع يعني حفظ الكود الذي تم كتابته فيها فقط.
بالتالي في حال قمت بحفظ ملفات المشروع فقط بدون بنائها سيظهر لك دائماً نتيجة آخر بناء فعلته عند التشغيل.


نقطة البداية في المكتبة

عندما نقوم بتجهيز مكتبة فنحن بذلك نقوم بتجهيز كود يمكن تضمينه في المشاريع و ليس كود عبارة عن برنامج بحد ذاته.
لهذا السبب المكتبة لا يفترض أن نضع فيها دالة إسمها main() نعتبرها كنقطة بداية كما نفعل في المشاريع العادية.

عدم وجود نقطة بداية في المكتبة معناها أنه يمكنك أن تفعل Build لها فقط و ليس Run لأنها بحد ذاتها ليست برنامجاً يمكن تشغيله.


أهمية بناء المكتبة بعد إجراء أي تحديث عليها

إعادة بناء المكتبة بعد أن تنتهي من كتابة الكود الخاص فيها في كل مرة من خلال النقر على على الزر Build أمر مهم جداً لكي يتم إنتاج نسخة جديدة من المكتبة نوعها .lib أو .a أو .dll أو .so على حسب نوع المكتبة (Static أو Dynamic) و نوع نظام التشغيل الذي تبني المكتبة عليه كما ذكرنا سابقاً.

الفرق بين المكتبات الثابتة و المكتبات الديناميكية

من ناحية التعامل مع الكود الموجود في المكتبات سواء كنت تستخدم مكتبة ثابتة أو مكتبة ديناميكية فإنه لا يوجد إي إختلاف من هذه الناحية.

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

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


معلومة تقنية

أحياناً عندما تحاول تشغيل برنامج ما على حاسوبك يظهر لك خطأ يخبرك بأنه يوجد ملف .dll ناقص يحتاجه البرنامج حتى يشتغل كالتالي.

هذا الخطأ معناه بكل بساطة أن البرنامج الذي تستخدمه في الأساس يستخدم المكتبة الديناميكية MSVCR71.dll التي تم ذكر إسمها و التي لم يستطع إيجادها.

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

طريقة إنشاء مكتبة و استخدامها

في البداية نود الإشارة إلى أننا نستخدم برنامج CodeBlocks في تطبيق الشرح و بالتالي سنشرح كيفية إضافة مكتبات خارجية بواسطته.
في حال كنت تستخدم برنامج آخر, ستخلتف قليلاً الطريقة التي تقوم فيها بتضمين المكتبة التي تنشئها في المشروع لأن كل برنامج يملك واجهة مختلفة للعمل.

الآن, بهدف جعل الشرح مبسط لأبعد حدود و يغطي كل المعلومات التي تحتاج معرفتها عند التعامل مع المكتبات, سنقوم بتقسيم المثال لأربع خطوات أساسية:

  1. إنشاء مشروع C++ عادي لأننا سنستخدمه لتجربة المكتبة.

  2. إنشاء مشروع آخر عبار عن المكتبة التي سنقوم بتضمينها في المشروع الأول.

  3. إضافة المكتبة في المشروع و استدعاء الدوال الموجودة فيها.

  4. إعادة التعديل على المكتبة و إضافة ملفات إمتدادها .cpp و .h فيها مع وضع الكود بداخل نطاق ( Namespace ).



1- خطوات إنشاء مشروع جديد

هنا وضعنا خطوات إنشاء مشروع C++ في برنامج CodeBlocks لأننا سنستخدمه لاحقاً لتجربة أي مكتبة ننشئها.
فعلياً سنقوم ببناء مشروع إسمه Test.

شاهد الخطوات »



2- خطوات إنشاء مكتبة ثابتة

هنا وضعنا الخطوات التي يجب إتباعها في برنامج CodeBlocks لإنشاء مكتبة ثابتة و تعريف بعض الدوال فيها و من ثم بنائها.
فعلياً سنقوم ببناء مشروع إسمه harmash و عند بنائه سنحصل على مكتبة إسمها libharmash.

شاهد الخطوات »



3- خطوات تضمين المكتبة في المشروع

هنا وضعنا الخطوات التي يجب إتباعها لتضمين مكتبة في أي مشروع يتم بناؤه بواسطة برنامج CodeBlocks.
فعلياً سنقوم بإضافة المكتبة libharmash في المشروع Test. بمعنى آخر سنعلم المترجم بمكان وجود المكتبة harmash التي سنستخدمها في المشروع Test.
بعدها سنقوم باستدعاء الدوال الموجودة في المكتبة التي تم تضمينها للتأكد من أن ذلك قد تم بنجاح.

شاهد الخطوات »



4- خطوات إضافة ملفات هيدر في المكتبة و تضمينها في المشروع

هنا قمنا بإضافة ملف إسمه Person.h و ملف إسمه Person.cpp في المشروع Harmash.
بعدها قمنا بتضمين الملف Person.h الموجود في المشروع Harmash في المشروع Test.
في النهاية قمنا باستخدام الكود الموجود في الملفات التي تم تضمينها للتأكد من ذلك قد تم بنجاح.

شاهد الخطوات »

الدورات

أدوات مساعدة

الأقسام

دورات
مقالات أسئلة مشاريع كتب