مكتبات الارتباط التي تم تجميعها بواسطة مترجمين مختلفين

StackOverflow https://stackoverflow.com/questions/1420284

سؤال

أود أن أسأل بمزيد من التفاصيل حول الإجابة التي حصلت عليها مؤخرًا هنا (الإجابة الثالثة):أساسيات اللغات المترجمة

إذا كتبت بلغة C وMinGW وقمت بالارتباط بمكتبة C++ المجمعة بواسطة VC - فهل ستعمل؟كيف أعرف مقدما؟

بمعنى آخر، إذا كنت قادرًا على إنشاء ملف .exe بدون تحذيرات والذي يرتبط بملف C++ .dll، وكنت قادرًا على تشغيل ملف .exe (فقط تشغيله، بدون إجراء مزيد من الاختبارات)، فهل يعني ذلك أنه نجح؟لن يتم تفريغ الأساسية في مرحلة ما؟

لكي أكون متأكدًا تمامًا، هل أحتاج إلى إعادة تجميع مصادر المكتبة بنفسي والارتباط بها؟

أدرك أنه قد تكون هناك مشكلة أحيانًا في ربط كود C++ وC ولكن كيف تعرف متى يعمل ويعمل؟

ملاحظة:نعم رأيتاستخدام المكتبات المجمعة...اعتقدت أن سؤالي مختلف قليلاً.

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

المحلول

إذا كتبت بلغة C وMinGW وقمت بالارتباط بمكتبة C++ المجمعة بواسطة VC - فهل ستعمل؟

يعتمد ذلك على المترجمين (وأنا لا أعرف MinGW) وعلى مكتبة C++ المحددة.

الأسباب التي قد تؤدي إلى عدم الارتباط أو احتمال تعطله في حالة الارتباط:

  1. تقوم مكتبة C++ بتصدير فئات وأساليب C++ باستخدام أسماء "مشوهة"., ، ولكن قد يكون تغيير اسم MinGW's C++ (لا أعرف) مختلفًا عن VC (وغير موجود عندما تقوم بالترميز في C بدلاً من C++)

  2. لا يستخدم كود VC نفس مكتبة وقت التشغيل C مثل MinGW، والتي ستعضك إذا كانت واجهة برمجة التطبيقات (API) هي أن الذاكرة يتم تخصيصها على الكومة بواسطة كود VC ومن المفترض بعد ذلك تحريرها بواسطة كود MinGW.

  3. كود VC غير متوافق ثنائيًا مع كود MinGW (لا يستخدم نفس اصطلاحات تمرير المعلمات، ولا ينفذ الاستثناءات بنفس الطريقة)

ومن ناحية أخرى، بعض الأسباب التي قد تجعله ناجحًا:

  1. مكتبة C++ مكتوبة بواجهة على طراز C، بواسطة مطورين كانوا يعتزمون استدعائها من مترجم مختلف

  2. نفس 1.

  3. لقد جعله صانعو برنامج التحويل البرمجي MinGW متوافقًا ثنائيًا مع VC

كيف أعرف مقدما؟

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

وإلا فلديك سؤال من مرحلتين:

  1. ما الذي يتطلبه الأمر (على سبيل المثال؟C بدلاً من C++، على سبيل المثال.لا يفترض أنهم يستخدمون نفس الكومة، على سبيل المثال.تحديد اصطلاح تمرير المعلمة) لرمز MinGW لاستدعاء رمز VC؟

  2. هل تمت كتابة مكتبة VC الخاصة بك مع أخذ ذلك في الاعتبار؟

من المحتمل أن يتمكن الشخص الذي استخدم كلا المترجمين من الإجابة على السؤال الأول (لم أستخدم MinGW).لا أعرف من يستطيع الإجابة على الثاني؛من كتب مكتبة VC تلك؟

نصائح أخرى

نعم، يمكنك تحويل MSVC المكتبات جمعت لمينغو دون اعادة تجميع.
تحتاج اثنين فقط من الأدوات ودلل. تحقق من هنا .

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

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