الشبكة العربية لمطوري الألعاب

خبير  مهند محمد علي مشاركة 1

السلام عليكم ورحمه الله
انا الان اتعلم لغه سي ++ لكن هنالك اشياء استخدمها لكن لا اعرف الفائده الدقيقه منها مثلا الملفات الراسيه اعرف انها للدوال والكلاس
 
لكن ما فائد ملفات .lib     يقولون انها للربط لكن كيف الربط
وايضا ملفات   .dll           ما الفائده منها (مثل التي في الدايركت اكس)

خبير  أحمد عزالدين مشاركة 2

السلام عليكم

مرحباً بك في الشبكة العربية لمطوري الالعاب أخي مهند

لكي تفهم الموضوع ، لابد أن تعرف أن أغلب البرامج التي نكتبها ، تستخدم مجموعة من الوظائف كتبها غيرنا ، وهذه الوظائف غالباً ما تكون موجودة في مكتبة برمجية تحتوي على وظائف أخرى ولكن في الغالب تحتوي كل مكتبة على وظائف متعلقة بموضوع معين (مثل مكتبة D3DX مثلا حيث تحتوي وظائف) تساعد مطوري الدايركت اكس في بعض المهام الشائعة مثل تحميل الاكساءات مثلاً

أيضاً من المهم أن نفهم أنه ولكي نستخدم هذه الوظائف (الخارجية ، التي كتبها غيرنا) فاننا نحتاج لان نخبر المترجم أين سيجد الكود الذي يمثل هذه الوظائف
وبالتالي فنحن نحدد كيف سيرتبط البرنامج الخاص بنا مع مكتبة الوظائف الخارجية ، وهناك طريقتين لفعل ذلك

الاولى: أن نجعل التطبيق يرتبط بتلك الوظائف بشكل ثابت static linking وذلك يعني أن المترجم سيقوم بالبحث عن ملفات المكتبة الخارجية أثناء عملية الترجمة ، وسيقوم بتحميل تلك الدوال (الوظائف الخارجية) أيضاً أثناء الترجمة static load ، وفي نظام ويندوز تكون هذه المكتبات بالامتداد .lib

الثانية: أن يرتبط التطبيق الخاص بنا بالمكتبات بشكل ديناميكي dynamic linking وذلك يعني أن المترجم لن يقوم باظهار خطأ أثناء الترجمة عند استخدام هذه الوظائف الخارجية اذ أنه لا يقوم بالبحث عنها وتحميلها أثناء عملية الترجمة ، بل يقوم بذلك بشكل ديناميكي عند تنفيذ الكود الذي يستخدمها أثناء تشغيل البرنامج وتسمى العملية dynamic loading ، وفي نظام ويندوز تكون هذه المكتبات بالامتداد .dll ولذلك يطلق عليها البعض مكتبات الربط الديناميكي dynamic linking library

الان نحن في لغة السي بلس بلس ، ونكتب برنامج يقوم بتحميل اكساء ، ونريد استخدام وظيفة جاهزة تابعة لمكتبة الدايركت اكس D3DXCreateTextureFromFile والتي تقوم بتحميل الاكساء (من ملف) ، واذا بحثنا عن تفاصيل هذه الدالة في مستندات مكتبة الدايركت اكس للمطورين DirectX SDK Documentation فاننا سنجد أن الدالة لها متطلبات للاستخدام كالاتي.
Requirements
Header: Declared in D3dx9tex.h. 
Library: Use D3dx9.lib

ولاننا نعرف أنه في لغة السي بلس بلس لا يمكننا أن نستخدم أي دالة الا بعد الاعلان عنها ، وبالتالي فقبل أن نسخدم دالة تحميل الاكساء نحتاج لنخبر المترجم أين سيجد الاعلان عنها declaration وهنا نجد أنه تم الاعلان عنها في ملف D3dx9tex.h فنقوم بادراج هذا الملف include قبل أن نستخدمها وبالتالي نفهم أن ملف الهيدر header file يحتوي على اعلان عن مجموعة من الوظائف والمتغيرات الخاصة - تذكر يحتوي فقط على الاعلان عن الوظائف- طيب الان نريد أن نخبر المترجم أين تم تعريف الدالة وأين يقع الكود الفعلي الخاص بها ، نجد ذلك في المكتبة D3dx9.lib وبالتالي نخبر المترجم أن برنامجنا يريد الارتباط مع هذه المكتبة حتى يتسنى للمترجم أن يجد تعريف الدالة ، ونفعل ذلك اما عن طريق اعدادات بيئة التطوير ، او بسطر الكود التالي مثلاً:
#pragma comment(lib, "d3dx9.lib")
في الامور بعض التفاصيل الاخرى
لكن أرجوا أن تكون قد اتضحت لك الامور ان شاء الله
اذا كانت لك أية استفسارات أخرى ، فلا تتردد بالسؤال عنها
بالتوفيق

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

مبتدئ  NULL مشاركة 3

السلام عليكم...

مكتبات الربط الديناميكي و الساتيكي
http://www.codeproject.com/KB/cpp/libraries1.aspx

الملفات الرئسية
http://www.learncpp.com/cpp-tutorial/19-header-files/

بالتوفيق مع ++C

خبير  algeria مشاركة 4

الملفات بالامتداد (.lib/.h/.dll)
هي مكتبات (ملفات نصية) تحوي كلاسات ودوال لوظائف جاهزة
أو مكتبات عادية يضيفها المبرمج ويضع فيها دوال معينة أو كلاسات أو أي شيء يحتاجه ثم يستدعي الملف

والفائدة من استعمال المكتبات هي إما لتجنب إعادة كتابة الأكواد
أو للعمل على وظائف أو كلاسات أو دوال جاهزة

موفق

الجزائر قلبي وغزة نبضه

خبير  مهند محمد علي مشاركة 5

افهم من هذا الكلام ان الملفات الراسيه هي التي يكتب فيها اعلان الدوال والكلاس اما ملفات الربط الاستاتيكي .lib هي التي يكتب فيها تعريف الداله لان الملف يكون مغلق ولا يمكن تغير محتواه
لكن لم افهم الغرض من ملفات الربط الدنميكي .dll  (بدون اثقال عليكم )... هل هي ايضا يوجد فيه دوال لكن لا يتم ترجمتها في ترجمه البرنامج بل اثناء عمل البرنامج مما يجعل حجم البرنامج اقل؟

خبير مدير وسام البهنسي مشاركة 6

في 15/شوال/1431 03:31 م، قال المهند بهدوء وتؤدة:

افهم من هذا الكلام ان الملفات الراسيه هي التي يكتب فيها اعلان الدوال والكلاس اما ملفات الربط الاستاتيكي .lib هي التي يكتب فيها تعريف الداله لان الملف يكون مغلق ولا يمكن تغير محتواه
لكن لم افهم الغرض من ملفات الربط الدنميكي .dll  (بدون اثقال عليكم )... هل هي ايضا يوجد فيه دوال لكن لا يتم ترجمتها في ترجمه البرنامج بل اثناء عمل البرنامج مما يجعل حجم البرنامج اقل؟

سأحاول طرح الموضوع من خلال مثال:
 
لديك كتاب وله فهرس. الفهرس فقط يعطيك عناوين المواضيع المحتواة، والتفاصيل في فصول الكتاب. في هذه الحالة، الفهرس تقابله ملفات الترويسة h.، وفصول الكتاب تقابلها كل من ملفات المكتبات الثابتة lib. والديناميكية dll. .
 
الآن السؤال هو ما الفرق بين lib و dll. كما ذكرت.. كلاهما يحملان كود لإجراءات. لكن أحدهما (الـ lib) يتم تضمينه داخل الملف التنفيذي النهائي (ملف الـ exe.) والآخر (الـ dll) لا يضمن داخله، وإنما يجب توزيعه مع الملف التنفيذي.
 
ميزة مكتبات DLL أنها قابلة للاستخدام بأية لغة برمجة وليس فقط لغة ++C. تستطيع إنشاء مكتبة DLL بلغة فيجوال بيسك مثلاً، واستدعاء إجراءاتها بلغة ++C أو ديلفي. بينما ملفات LIB خاصة بـ ++C فقط.
 
ميزة أخرى تختص بها ملفات DLL هي للبرامج التي تتألف من عدة ملفات تنفيذية exe، وكل من تلك الملفات تستخدم خدمات المكتبة. في تلك الحالة يكفي وضع ملف الـ DLL مرة واحدة بجانب الملفات التنفيذية إياها وستعمل كلها بشكل صحيح. بينما مكتبة الـ LIB يجب أن تضمن في كل ملف تنفيذي على حدة، مما يعني أنها قد تضمن ثلاث أو أربع مرات رغم أن المكتبة هي نفسها ولم تتغير، مما يعني مضيعة لمساحة التخزين.
 
ميزة ثالثة لملفات DLL هي أنها تتيح لك تحديث البرنامج بسهولة. فلو كان لديك برنامجاً يعتمد مكتبة JPEG لتحميل الصور مثلاً، ثم ظهر من تلك المكتبة إصدار جديد أسرع بالتحميل مثلاً، فيكفي أن تستبدل ملف الـ DLL الخاص بمكتبة JPEG بدلاً من النسخة السابقة وستعمل المكتبة الجديدة مع برنامجك دون الحاجة لإعادة بناء البرنامج.
 
بالمقابل، مكتبات LIB هي في الحقيقة حزمة من ملفات CPP بصورة مترجمة. فمثلاً لو أردت أن تعطي لصديقك المبرمج مكتبة أنشأتها أنت ولا تريده أن يعلم تفاصيل عملها، فتستطيع إعطاؤه المكتبة على شكل LIB بدلاً من إعطائه ملفات الـ CPP مباشرة.
 
طبيعة الربط المباشر مع البرنامج أثناء بنائه بدلاً من أثناء تشغيله تعطي مكتبات LIB ميزة مهمة جداً جداً، وهي إمكانية تحسين أداء البرنامج ككل، متضمناً الإجراءات في مكتبات LIB المستخدمة. بينما في حالة مكتبات DLL فإن هذا غير ممكن البتة.
 
أرجو أن تكون قد وضحت لك الأمور أكثر الآن ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير  مهند محمد علي مشاركة 7

اولا اشكر الجميع علي جب المساعده.........
وثانيا:
عملت داله بسيطه تجمع رقمين


int sum(int ,int ) ///الاعلان

ثم عملت مكتبه اسميتها
lib.1111
وعملت عمليه الربط عن طريق الابشن وحدت المسار وكتبت اسم المكتبه
ويا فرحتي لقد تم العمليه بنجاح
(0_0)
لكن المشكله عندي كيف ارفق ملف ربط ديناميكي
.dll
علما انيي عملت ملف وكتبت فيه تعريف الداله
ووضعته في المسار الذي حدته للمترجم
لكن لا يستطيع قرايه التعريف من الملف
علما انني استخدم الفيجول سي بلس بلس

خبير  مهند محمد علي مشاركة 8

ها ......... شباب منتظر ردكم علي احر من الجمر
عن دمج ملف ربط ديناميكي .dll
في  الملف التنفيذي

مبتدئ  NULL مشاركة 9

السلام عليكم
ربط الملف التنفيذي مع ملف DLL

DLL Tutorial For Beginner

http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9855
يرجى الإطلاع .... شرح وافي و كافي

يوجد مثال في الشرح الموجود في الرابط يحتوي على الكود التالي



#include 
#include 

typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();

int main()
{
   AddFunc _AddFunc;
   FunctionFunc _FunctionFunc;
   HINSTANCE hInstLibrary = LoadLibrary("DLL_Tutorial.dll");

   if (hInstLibrary)
   {
      _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
      _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary,
         "Function");

      if (_AddFunc)
      {
         std::cout << "23 = 43 = " << _AddFunc(23, 43) << std::endl;
      }
      if (_FunctionFunc)
      {
         _FunctionFunc();
      }

      FreeLibrary(hInstLibrary);
   }
   else
   {
      std::cout << "DLL Failed To Load!" << std::endl;
   }

   std::cin.get();

   return 0;
}

عند السطر اكتب اسم المكتبة التي كتيتها

HINSTANCE hInstLibrary = LoadLibrary("DLL_Tutorial.dll");

و عند السطرين يتم استدعاء تابعين (Add) , (Function)


  _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
      _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary,
         "Function");


بالتوفيق....

خبير مدير وسام البهنسي مشاركة 10

بتاريخ 15/شوال/1431 11:14 م، قطب المهند حاجبيه بشدة وهو يقول:

لكن المشكله عندي كيف ارفق ملف ربط ديناميكي
.dll
علما انيي عملت ملف وكتبت فيه تعريف الداله
ووضعته في المسار الذي حدته للمترجم
لكن لا يستطيع قرايه التعريف من الملف
علما انني استخدم الفيجول سي بلس بلس

أرجو أن تكتب الخطوات التي اتبعتها في فيجوال ستوديو لإنشاء مكتبة الـ DLL.
 


وفي 16/شوال/1431 07:11 ص، أعرب المهند عن رأيه بالموقف كالآتي:

ها ......... شباب منتظر ردكم علي احر من الجمر
عن دمج ملف ربط ديناميكي .dll
في  الملف التنفيذي

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

وسام البهنسي
مبرمج في إنفيديا وإنفريمز