سؤال

لدي مشروع تم تجميعه باستخدام __cdecl استدعاء الاتفاقية (MSVC2010) وتجميع التعزيز باستخدام نفس المترجم باستخدام الإعدادات الافتراضية.

المشروع مرتبط بـ Boost ولكني في وقت التشغيل ، تلقيت رسالة تأكيد مثل هذا: ملف: ... Boost Boost Program_options detail parsers.hpp الخط: 79

فشل فحص وقت التشغيل #0 - لم يتم حفظ قيمة ESP بشكل صحيح عبر مكالمة وظيفة. عادة ما يكون هذا نتيجة لاستدعاء وظيفة معلنة مع اتفاقية استدعاء واحدة مع مؤشر وظيفة معلن مع اتفاقية الاتصال المختلفة.

هناك الأسئلة التالية:

  • ما هي اتفاقية الاتصال التي تعززها بشكل افتراضي على Windows (MSVC2010)
  • كيف أقوم بتجميع تعزيز مع اتفاقية الاتصال __cdecl
  • لماذا لم تكن Boost قادرة على منع الارتباط بالرمز مع اتفاقيات الاتصال المختلفة؟ فهمت أن Boost لديه رمز ذكي للمكتبة التلقائية.

تحديث #1

يبدو أن Boost لا يجمع ويربط مع اتفاقية الاتصال المناسبة ، ولا يزال في وقت التشغيل أحصل على المشكلة أعلاه. قمت بتطبيق عينة باستخدام نفس الرمز وهو يعمل ولكن في طلبي يفشل. يمكن أن يكون الفرق الوحيد من تكوين المشروع أو يتضمن/stdafx.h

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

المحلول 3

لقد وجدت سبب المشكلة داخل أحد ملفات الخصائص المشتركة: <StructMemberAlignment>4Bytes</StructMemberAlignment>

إذا قمت بإزالته ، فسيعمل الرمز. ومع ذلك ، لست متأكدًا من حدوث ذلك وكيف يمكنني حلها دون إزالة الكود أعلاه (الذي كانت مطلوبة من قبل مكتبة أخرى).

أضفت سؤالًا آخر بخصوص تعزيز ومواءمة عضو الهيكل.

نصائح أخرى

فقط استخدم

bjam ... **cxxflags=/Zp4**

أثناء بناء المكتبات التعزيز.

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

bjam cxxflags =/gd ...

(نرى BBV2 بنيت الميزات)

أو لجعلها "دائمة" إعداد user-config.jam مع برنامج التحويل البرمجي الخاص بك وإضافته إلى خيارات الإنشاء لبناء BBV2 MSVC (انظر تكوين BBV2 والمستندات ذات الصلة). بالنسبة لك أسئلة أخرى:

  1. يستخدم Boost مؤتمر الاتصالات الافتراضية التي تستخدمها MSVC ، باستثناء الحالات التي يتجاوزها على مستوى الكود. لا أعرف أين هم لأنها مكتبة محددة. لذلك يجب عليك البحث في الكود عن ديكور الكود "__*".
  2. انظر أعلاه للحصول على إجابة جزئية.
  3. كشف؛ هناك سببان: هناك حد لعدد الخيارات المختلفة التي يمكننا اكتشافها بشكل معقول للبناء لأنه نمو أسي للاختلافات المحتملة المختلفة ، لذلك نقصرها على أهم الحالات. وفي حالة اتفاقية الاتصال ، فإنه ليس ممكنًا بالفعل لأنه شيء يمكن تغييره على أساس الوظيفة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top