سؤال

يمكن لأي شخص أن يشرح كيفية تجميع يعمل ؟

أنا لا يمكن أن يبدو لمعرفة كيفية تجميع الأعمال..

أن تكون أكثر تحديدا, هنا مثال..أحاول كتابة بعض التعليمات البرمجية في MSVC++ 6 لتحميل لوا الدولة..

لقد سبق:

  • تعيين أدلة إضافية على المكتبة وتشمل الملفات إلى اليمين الدلائل
  • تستخدم extern "C" (لأن لوا هو C فقط أو سمعت)
  • تشمل أن الحق في رأس الملفات

ولكن أنا لا يزال الحصول على بعض الأخطاء في MSVC++6 عن حل الرموز الخارجية (ل لوا الوظائف التي استعملتها).

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

الخطوة 1:

  • الإدخال:شفرة المصدر(s)
  • العملية:تحليل (ربما إضافة مزيد من التفاصيل هنا)
  • الإخراج:ما هو الناتج هنا..

الخطوة 2:

  • الإدخال:مهما كان الناتج من الخطوة 1 ، بالإضافة إلى ربما ما هو مطلوب (المكتبات ؟ Dll ؟ .لذلك ؟ .ليب?)
  • العملية:ما هو القيام به مع الإدخال
  • الإخراج:ما هو الناتج

وهلم جرا..

شكرا..

ربما هذا يفسر ما الرموز ماذا بالضبط "ربط" هو ما "كائن" رمز أو أيا كان هو..

شكرا..آسف لكوني مستجد..

P. S.هذا لا يجب أن تكون لغة معينة..ولكن لا تتردد في التعبير عن ذلك في اللغة كنت أكثر راحة في..:)

تحرير:على أي حال, لقد كنت قادرا على الحصول على أخطاء حلها ، اتضح أن لدي لإضافة يدويا .الملف lib إلى المشروع ؛ ببساطة تحديد مكتبة الدليل (حيث .ليب يقيم) في إعدادات IDE أو إعدادات المشروع لا يعمل..

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

تحرير:فقط مرجعية إضافية ، وجدت مادتين من قبل مؤلف واحد (مايك Diehl) في شرح هذا جيدا..:) دراسة عملية تجميع:الجزء 1 دراسة عملية تجميع:الجزء 2

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

المحلول

من المصدر إلى الملف القابل للتنفيذ عموما عملية من مرحلتين C وما يرتبط بها من اللغات ، على الرغم من IDE ربما يعرض هذا بمثابة عملية واحدة.

1/ أنت رمز الخاص بك المصدر وتشغيله من خلال مترجم.المترجم في هذه المرحلة يحتاج إلى مصدر رأس الملفات من الأشياء الأخرى التي كنت تنوي الارتباط مع (انظر أدناه).

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

2/ ربط المرحلة القادمة هو الجمع بين كل ما تبذلونه من وجوه الملفات مع المكتبات إلى إنشاء ملف قابل للتنفيذ.وأنا لن تغطي ديناميكية الربط هنا منذ ذلك سوف يعقد مع شرح فائدة تذكر.

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

وكمثال على ذلك يجب مراعاة ما يلي تبسيط التعليمات البرمجية C (xx.c) و القيادة.

#include <bob.h>
int x = bob_fn(7);

cc -c -o xx.obj xx.c

هذا برمجيا xx.c ملف xx.obj.على bob.h يحتوي النموذج على bob_fn() بحيث تجميع سوف تنجح.على -c يرشد مترجم لتوليد كائن الملف بدلا من قابل للتنفيذ ، -o xx.obj يحدد اسم ملف الإخراج.

ولكن الفعلي رمز بالنسبة bob_fn() ليس في ملف الرأس ولكن في /bob/libs/libbob.so, لذا على الرابط, كنت بحاجة إلى شيء مثل:

cc -o xx.exe xx.obj -L/bob/libs;/usr/lib -lbob

وهذا يخلق xx.exe من xx.obj, باستخدام المكتبات (بحثت في مسارات) من شكل libbob.so (lib و .حتى يتم إضافتها من قبل linker عادة).في هذا المثال ، -L يحدد مسار البحث عن المكتبات.على -l يحدد المكتبة للعثور على إدراجها في الملف القابل للتنفيذ إذا لزم الأمر.رابط يأخذ عادة "بوب" ويجد الأولى ذات الصلة مكتبة الملف في مسار البحث المحددة من قبل -L.

مكتبة الملف هو في الحقيقة مجموعة من ملفات الكائن (نوع من كم ملف مضغوط يحتوي على عدة ملفات أخرى ، ولكن ليس بالضرورة مضغوط) - عند أول ذات الصلة وقوع undefined الخارجية تم العثور على الكائن يتم نسخ الملف من المكتبة إضافة إلى الملف القابل للتنفيذ تماما مثل الخاص بك xx.obj الملف.عموما هذا وتستمر حتى لا يوجد المزيد من externals لم يتم حلها.فإن ذات الصلة المكتبة هو تعديل "بوب" النص ، فإنه قد تبحث عن libbob.a, libbob.dll, libbob.so, bob.a, bob.dll, bob.so وهلم جرا.أهمية قررت رابط نفسها و يجب أن تكون موثقة.

كيف يعمل يعتمد على الرابط ولكن هذا هو الأساس.

1/ كل كائن ملفات تحتوي على قائمة من externals لم يتم حلها أنهم بحاجة إلى حل.رابط يجمع كل هذه الأشياء و إصلاح الروابط بينهما (حل العديد من الظواهر ممكن).

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

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

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

نصائح أخرى

الخطوة 1 - مترجم:

  • الإدخال:Source code file[s]
  • العملية:تحليل شفرة المصدر و ترجمة إلى رمز الجهاز
  • الإخراج:ملف الكائن[s] ، والتي تتكون من:
    • أسماء الرموز التي تم تعريفها في هذا الكائن ، هذا الكائن الملف "الصادرات"
    • الجهاز رمز المرتبطة مع بعضها الرمز المحدد في هذا الكائن الملف
    • أسماء الرموز التي لم يتم تعريف في هذا الكائن الملف ، ولكن على أي برنامج في هذا الكائن الملف يعتمد والتي يجب بعد ذلك أن يرتبط أيأسماء هذا الكائن الملف "الواردات"

الخطوة 2 - الربط:

  • الإدخال:
    • ملف الكائن[s] من الخطوة 1
    • مكتبات الكائنات الأخرى (مثلا ، من O/S وغيرها من البرامج)
  • العملية:
    • لكل كائن التي تريد الارتباط
    • الحصول على قائمة من الرموز التي هذا الكائن الواردات
    • تجد هذه الرموز في المكتبات الأخرى
    • رابط المقابلة المكتبات وجوه الخاص بك الملفات
  • الإخراج:واحد الملف القابل للتنفيذ الذي يتضمن رمز الجهاز من جميع الأشياء الخاصة بك ، بالإضافة إلى الكائنات من المكتبات التي تم استيرادها (مرتبط) إلى الأشياء الخاصة بك.

اثنين من الخطوات الرئيسية هي تجميع و ربط.

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

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

الآن أن أشرح شيئا عن 'extern "C" ما تحتاجه:

ج لا يملك وظيفة الحمولة الزائدة.وظيفة دائما معترف بها من قبل اسمها.لذلك ، عند ترجمة التعليمات البرمجية C البرمجية فقط الاسم الحقيقي وظيفة يتم تخزينها في ملف الكائن.

C++ ، ومع ذلك ، فقد ما يسمى 'وظيفة / طريقة التحميل الزائد'.وهذا يعني أن اسم وظيفة لم يعد كافيا لتحديد ذلك.C++ compilers ولذلك خلق 'أسماء' عن الوظائف التي تشمل نماذج من وظيفة (منذ الاسم بالإضافة إلى النموذج بشكل فريد على وظيفة).هذا هو المعروف باسم 'اسم تغيير اسم'.

إن 'extern "C"' المواصفات المطلوبة عندما تريد استخدام المكتبة التي تم جمعها باسم 'ج' رمز (على سبيل المثال ، قبل تجميعها لوا الثنائيات) من C++ المشروع.

أجل المشكلة بالضبط:إذا كان لا يزال لا يعمل ، هذه النصائح قد تساعدك:* هل لوا الثنائيات تم تجميع مع نفس الإصدار من VC++?* يمكنك ببساطة تجميع لوا نفسك ، إما داخل VC الحل ، أو كمشروع منفصل مثل C++ الكود ؟ * هل أنت متأكد أن لديك كل extern "C"' أشياء صحيحة ؟

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

السبب في أنك تحصل على "حل الرموز الخارجية" لأنه جمع في C++ يعمل على مرحلتين.أول مدونة يحصل جمعت كل .الملف cpp في نفسه .الملف obj ثم "رابط" يبدأ والانضمام إلى كل ذلك .الكائنات الملفات في .ملف exe..الملف lib هو مجرد حفنة من .الكائنات الملفات اندمجت معا لجعل توزيع المكتبات قليلا simplier.وذلك عن طريق إضافة جميع "#include" و extern إعلان قلت المترجم أنه في مكان ما أنه سوف يكون من الممكن العثور على التعليمات البرمجية مع تلك التوقيعات ولكن رابط لا يمكن العثور على هذا الرمز لأنه لا يعرف أين تلك .ليب الملفات الفعلية يتم وضع التعليمات البرمجية.

تأكد من أنك قد قرأت REDME من المكتبة ، وعادة ما يكون بدلا شرح مفصل عن ما عليك القيام به في التعليمات البرمجية الخاصة بك.

قد تحتاج أيضا إلى التحقق من ذلك: مترجم, المجمع, رابط تحميل:قصة قصيرة.

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