خطأ غريب في رابط MFC / VC++ (std::list<CRect> محدد بالفعل)

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

  •  02-07-2019
  •  | 
  •  

سؤال

لقد تلقيت رسالة خطأ غريبة حقًا والتي تظهر فقط عندما أقوم بإضافة السطر التالي إلى مشروعي:

std::list<CRect> myVar;

تجدر الإشارة إلى أنه ليس من الضروري أن تكون قائمة std::list، بل يمكن أن تكون std::vector أو أي حاوية STL أخرى أفترضها.

هنا هي رسالة الخطأ:

خطأ 1 خطأ LNK2005:"عام:__thiscall std::list

:: list> (void) "(؟؟ 0؟ $ list@vcrect@v؟ $ inclocator@vcrect@nibstdstd qae@xz) تم تعريفه بالفعل في somelowlevellibrary.lib

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

يمكنني التخلص من خطأ الرابط إذا قمت بتغيير سطر التعليمات البرمجية إلى:

std::list<CRect*> myVar;

لكنني لا أريد اختراقها من أجلها.

أيضًا، لا يهم إذا قمت بإنشاء المتغير على المكدس أو الكومة، ما زلت أتلقى نفس الخطأ.

هل لدى أي شخص أي أفكار على الإطلاق حول هذا؟أنا أستخدم Microsoft Visual Studio 2008 SP1 على نظام التشغيل Vista Enterprise.

يحرر: خطأ الرابط أعلاه يتعلق بالمنشئ std::list<>، كما أنني أحصل على خطأ بشأن المدمر و_Nextnode والوظائف الواضحة.

يحرر: في الملفات الأخرى في المشروع، لن يتم ربط std::vector، وفي الملفات الأخرى قد يكون std::list.لا أستطيع معرفة سبب عمل بعض الحاويات والبعض الآخر لا يعمل.ارتباط MFC ثابت عبر كلا المكتبتين.في المكتبة ذات المستوى المنخفض لدينا فئة واحدة ترث من قائمة std::list.

يحرر: لا تحتوي المكتبة ذات المستوى المنخفض على أي فئات ترث من CRect، ولكنها تستخدم STL.

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

المحلول 2

لقد عثرت مؤخرًا على هذا الخطأ مرة أخرى في مشروعنا وقررت إجراء تحقيق أكثر شمولاً مقارنةً بمجرد تصحيحه باستخدام اختراق مثل المرة الأخيرة (مبادلة std::list لـ CArray).اتضح أن إحدى مكتباتنا ذات المستوى المنخفض كانت ترث من قائمة std::list، على سبيل المثال.

class LIB_EXPORT CRectList : public std::list<CRect>
{
};

هذه ليست مجرد ممارسة سيئة، ولكنها كانت أيضًا سببًا لأخطاء الرابط في التطبيق الرئيسي.لقد قمت بتغيير CRectList ليلتف std::list بدلاً من أن يرث منه ويختفي الخطأ.

نصائح أخرى

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

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

هل يحتوي SomeLowLevelLibrary.lib على أي فئات تسمى CRect أو يستخدمها؟هل يستخدم STL؟

هل تم تضمين الملف في رأس يمكن تجميعه في وحدتين منفصلتين للتعليمات البرمجية؟

احتمال عشوائي آخر برز في رأسي اليوم.هل من الممكن أن تشير مكتبة DLL الحالية ومكتبتك ذات المستوى المنخفض إلى إصدارين مختلفين من MFC؟ضربة طويلة.

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