تمامًا كما يحتوي ملف التعليمات البرمجية على سطر واحد أو أكثر من التعليمات البرمجية كمحتوى لجعله جديرًا بالاهتمام، يتم إنشاء ملف التكوين الأساسي باستخدام المتغيرات والقواعد والأهداف. بخلاف ذلك، هناك عوامل أخرى أيضًا ضرورية لإنشاء ملف تعريف كامل دون أي مشاكل. في هذا الدليل، سنناقش بناء جملة ملف التعريف الأساسي والمشكلات الشائعة أثناء كتابة ملف تعريف وتقديم حلول لحل هذه المشكلات.
فهم بناء جملة Makefile الأساسي
للبدء في إنشاء ملف makefile، نشرح الخصائص الأساسية لملف makefile عبر مثال كود makefile. من الضروري تضمين خصائص بناء الجملة التالية في محتوى ملف التعريف للحصول على ملف قابل للتنفيذ:
عامل s: كائنات تخزين البيانات الأساسية الضرورية لاستخدامها في ملف التعريف. يتم استخدام هذه المتغيرات لتحديد المترجم والأعلام والملفات المصدر وملفات الكائنات والملفات الهدف. ضمن نموذج الملف التالي، يوجد إجمالي خمسة متغيرات وهي CXX (لتعيين مترجم C++)، وCXXFLAGSc (إشارات المترجم)، وTARGET (لتعيين اسم ملف هدف قابل للتنفيذ)، وSRCS (لتعيين ملف التعليمات البرمجية المصدر) OBJS (ليحتوي على ملفات الكائنات التي يتم إنشاؤها عبر ملف التعليمات البرمجية المصدر).
الأهداف: الناتج المتوقع للبناء من المصدر. يمكن أن يكون ملف هدف أو أي اسم رمزي: 'all' هو الهدف الافتراضي الذي يجب بناؤه عبر متغير 'TARGET'، ويعتمد '$TARGET' على متغيرات 'OBJS'، والهدف 'نظيف' يزيل الهدف و ملفات الكائنات من دليل العمل.
القواعد وأوامر البناء: مجموعة من التعليمات الأساسية التي سيتم تنفيذها لإنشاء هدف من الملف المصدر أو التبعيات. على سبيل المثال، تعرض القاعدة '%.o: %.cpp' أن الملف ذو الامتداد 'cpp' يُستخدم لإنشاء ملف كائن بالامتداد 'o' بينما يحتوي كلا الملفين على نفس الاسم. ومن ناحية أخرى، أمر البناء $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) يتم استخدامه لربط ملف كائن وملف هدف جديد معًا. بنفس الطريقة، أمر البناء $(CXX) $(CXXFLAGS) -c $< -o $@ يجمع الملف المصدر إلى ملف كائن.
التبعيات: التبعيات موجودة دائمًا عندما تريد إنشاء ملف تعريفي. على سبيل المثال، يعتمد الهدف 'all' على المتغير 'TARGET' بينما يعتمد 'TARGET' على المتغير 'OBJS'. وفي الوقت نفسه، يعتمد المتغير 'OBJS' على الملف المصدر عبر المتغير 'SRCS'.
تعليقات: عادةً ما تُستخدم الإرشادات التي يمكن للإنسان فهمها لشرح الغرض من سطر التعليمات البرمجية في حالة استخدام ملف بعد فترة طويلة. في ملف makefile التالي، نستخدم التعليقات التي تبدأ بعلامة '#' لشرح كل سطر.
CXX = ز++
CXXFLAGS = -الأمراض المنقولة جنسيا =ج++ أحد عشر -حائط
الهدف = جديد
SRCS = main.cpp
أوبجس = $ ( SRCS:.cpp=.o )
الكل: $ ( هدف )
$ ( هدف ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( هدف ) $ ( OBJS )
% .O: % .CPP
$ ( CXX ) $ ( CXXFLAGS ) -ج $ < -O $ @
ينظف:
جمهورية مقدونيا -F $ ( هدف ) $ ( OBJS )
القضايا والحلول المشتركة
أثناء كتابة أي ملف تعريفي، من الضروري مراعاة كل التفاصيل الصغيرة للحصول على النتيجة المطلوبة في النهاية. كثيرًا ما يواجه المستخدمون بعض المشكلات الشائعة أثناء إنشاء ملف تعريف. وفي هذا القسم سنناقش تلك القضايا ونقترح الحلول الممكنة كما يلي:
1: عدم استخدام المتغيرات
يعد استخدام المتغيرات في ملف makefile أمرًا ضروريًا لأنه مطلوب لتعيين المترجمين والهدف والملفات المصدر وما إلى ذلك. المشكلة الأكثر شيوعًا التي يمكن مواجهتها هي عدم استخدام أي متغير في ملف makefile. ولذلك، تأكد من استخدام المتغيرات الأساسية مثل CXX، وCXXFLAGSc (أعلام المترجم)، وTARGET، وSRCS، وOBJS في ملف التكوين النموذجي السابق.
2: مشكلة الفاصل المفقود
أثناء كتابة ملف تكوين، من الضروري مراعاة قواعد المسافة البادئة بعناية شديدة لأن استخدام المسافات بدلاً من علامات التبويب سيقودك إلى مشكلة 'الفاصل المفقود' أثناء تنفيذ تعليمات 'الإنشاء'. على سبيل المثال، نضيف المسافة في بداية القاعدة في السطر 13 ونزيل علامة التبويب.
$ ( هدف ) : $ ( OBJS )$ ( CXX ) $ ( CXXFLAGS ) -O $ ( هدف ) $ ( OBJS )
عند تنفيذ استعلام 'make'، نحصل على خطأ 'فاصل مفقود' في السطر 13، ويتوقف الملف عن العمل. لتجنب هذه المشكلة، تأكد من استخدام 'علامة التبويب' بدلاً من المسافات.
يصنع
لتجنب هذه المشكلة، تأكد من استخدام 'tab' بدلاً من المسافات كما هو موضح في الصورة التالية:
$ ( هدف ) : $ ( OBJS )$ ( CXX ) $ ( CXXFLAGS ) -O $ ( هدف ) $ ( OBJS )
3: مشكلة 'لم يتم العثور على نقطة الإدخال'.
يحدث هذا الخطأ غالبًا بسبب الملف المصدر وليس بسبب الملف التعريفي، كما هو الحال عندما تفوت استخدام وظيفة 'main()' في ملف التعليمات البرمجية المصدر. على سبيل المثال، نستبدل تعريف الدالة main() بإعلان دالة بسيط محدد من قبل المستخدم.
#تشملعرض كثافة العمليات ( ) {
شار الخامس؛
الأمراض المنقولة جنسيا::كوت << 'أدخل قيمة:' ;
الأمراض المنقولة جنسيا::سين >> في؛
الأمراض المنقولة جنسيا::كوت << في << ستد::endl;
يعود 0 ;
}
عند تنفيذ تعليمات 'make' في موجه أوامر Windows، نواجه 'مرجعًا غير محدد إلى 'WinMain''. وذلك لأن المترجم لم يجد أي نقطة دخول لبدء تنفيذ ملف C++. لحل هذه المشكلة، استبدل كلمة 'show' بكلمة 'main'.
4: استخدام ملحقات غير صحيحة
في بعض الأحيان، قد يستخدم المستخدم عن غير قصد الامتدادات الخاطئة للملف المصدر لاستخدامه في ملف التكوين. سيؤدي استخدام الامتداد الخاطئ إلى حدوث أخطاء في وقت التشغيل، أي عدم وجود قاعدة لتحديد الهدف. نقوم بإنشاء ملف تعريفي لإنشاء الملف القابل للتنفيذ والملف الكائني لملف C++. في السطر السابع نقوم بتوفير الملف المصدر بالامتداد 'c'.
سي اكس اكس := ز++CXXFLAGS := -الأمراض المنقولة جنسيا =ج++ أحد عشر -حائط
الهدف = جديد
سركس = main.c
أوبجس = $ ( SRCS:.cpp=.o )
الكل: $ ( هدف )
$ ( هدف ) : $ ( OBJS )
يؤدي تشغيل تعليمات 'make' إلى ظهور الخطأ 'لا توجد قاعدة لجعل الهدف 'main.c''. لتجنب هذه المشكلة، تأكد من استخدام ملحق الملف المصدر الصحيح.
يصنع
5: التبعيات المفقودة
أثناء كتابة ملف تعريفي، يجب عليك تضمين كافة التبعيات للملف المصدر للحصول على الإخراج المطلوب. على سبيل المثال، يستخدم ملف التعليمات البرمجية C++ الخاص بنا الملف 'myheader.h' باعتباره تبعية له. ولذلك نذكرها في ملف كود C++ كما يلي:
#تشمل# تشمل 'myheader.h'
عرض كثافة العمليات ( ) {
شار الخامس؛
الأمراض المنقولة جنسيا::كوت << 'أدخل قيمة:' ;
الأمراض المنقولة جنسيا::سين >> في؛
الأمراض المنقولة جنسيا::كوت << في << ستد::endl;
يعود 0 ;
}
داخل ملف makefile، نتجاهل عمدًا استخدام ملف 'myheader.h' ضمن قاعدة البناء المكتوبة في السطر 9.
% .O: % .CPP$ ( CXX ) $ ( CXXFLAGS ) -ج $ < -O $ @
الآن، أثناء استخدام تعليمات 'make'، نواجه الخطأ 'لا يوجد شيء يجب القيام به من أجل 'الكل''.
يصنع% .O: % .cpp myheader.h
$ ( CXX ) $ ( CXXFLAGS ) -ج $ < -O $ @
لتجنب المشكلة المذكورة وتشغيل الكود المصدري بنجاح، اذكر اسم الملف 'myheader.h' في السطر التاسع من ملف makefile كما هو موضح في ما يلي:
خاتمة
في هذا الدليل، شرحنا بدقة بناء جملة makefile باستخدام محتوياته الضرورية مثل المتغيرات وأوامر البناء والقواعد وما إلى ذلك. تم تضمين مثال التعليمات البرمجية لتوضيح بناء الجملة بشكل أكثر وضوحًا. في النهاية، ناقشنا بعض المشكلات العادية وحلولها التي يمكن أن يواجهها المستخدم أثناء إنشاء ملف تعريف.