أسباب ILINK32 خطأ:حل الخارجية '__fastcall النظام::TObject::مثيل جديد(نظام::TMetaClass *)' المشار إليه من XXX.obj ؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

أنا على الحصول على الخطأ التالي من C++ Builder عام 2009 رابط

Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?

لدينا مجموعة من دلفي الملفات (.pas) و مجموعة من C++ Builder الملفات (.hpp و .obj), التي تم إنشاؤها من هذه .pas ملفات.

مجموعة من الملفات يتم نسخها إلى جهاز آخر.كل جهاز لديه نفس C++ Builder 2009 نسخة مع التحديثات نفسها (أحدث:3+4) مثبتة.

عند إنشاء فارغة VCL التطبيق في C++ Builder على آلة أخرى و تشمل الكائنات ملف من هذه المجموعة إلى المشروع النشط ، أحصل على الخطأ المذكورة أعلاه في ربط المرحلة.

أشياء غريبة عن هذا الخطأ هي:

  1. هذا الخطأ يمكن أن تكون مستنسخة على كل آلة أو C++ Builder التثبيت (لقد راجعت ما لا يقل عن 5 منهم).
  2. إذا قمت بإزالة الكائنات الملف بدلا من ذلك إضافة المقابلة pas ملف المشروع - الخطأ سوف تختفي.
  3. ولكن إذا قمت بإزالة pas-ملف يشمل الكائنات الملف مرة أخرى - لن يكون هناك أي خطأ.
  4. أيا من الكائنات pas ملفات يحصل تعديل في هذه العملية.أولا-هاء.إذا قمت بحذف هذه مجموعة من الملفات من الجهاز وجلب لهم من الجهاز الأول مرة أخرى (حيث تم إنشاؤها) - سوف لا تزال لديها أي خطأ.
  5. مرة واحدة يمكنك أن تفعل ذلك على تسلسل معين واحد آلة (وتشمل/استبعاد pas-ملف من المشروع) - يمكنك لم يعد الحصول على هذا الخطأ على أنه آلة ، بغض النظر عن مدى صعوبة محاولة (نقل الملفات بين المجلدات اللعب مع الإعدادات ، الخ ، الخ).في الحقيقة أنا بالفعل لا آلات أين يمكنني إعادة إنشاء هذا الخطأ الآن :(

أنا لا أرى كيف الوضع "بعد" يختلف عن الوضع "قبل" (بعد/قبل إدراج pas ملف) ، لذلك الخطأ مرئيا فقط قبل و لا بعد.

ذكر هذا الخطأ (أو مشابهة جدا خطأ) على الإنترنت هذا.ولكن لا يوجد حل.لا توجد "+" حرف في الطريق أو الأماكن (" ").

أنا في عداد المفقودين شيئا ؟ الآن يبدو C++ Builder علة لي.

P. S.ونحن لا يمكن استخدام "تشمل فقط pas-الملف" الحل, كما أننا بحاجة إلى نشر فقط .hpp و .obj (لا .pas الملفات) على بعض الأجهزة.

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

المحلول 3

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

لدي عدة إصدارات من C++ Builders وDelphis مثبتة.ولسبب ما، التقط رابط C++ Builder لعام 2009 ملفات obj خاطئة - تلك التي يجب استخدامها لإصدار آخر (ربما 2007).

كان سبب الخطأ هو تغيير NewInstance بين إصداري 2007 و2009 - راجع هنا: https://forums.codegear.com/thread.jspa?messageID=161105

نصائح أخرى

كنت أيضا الحصول على هذا الخطأ ولكن كان لأنه كان هذا تعريف:

virtual void getMaxSafeSpace();

بدلا من:

virtual void getMaxSafeSpace()=0;

في فئة مجردة.

يبدو أنه إذا قمت بإنشاء المشروع من ملفات pas، فسيتم تعريف نسخة من الوظيفة '__fastcall System::TObject::NewInstance(System::TMetaClass *)' في مكان ما، ولكن ليس في ملفات obj، ويتم ربطها بـ الثنائي.بمجرد تعريف الدالة، يقوم الملف XXX.obj بالعثور عليها.لذا، إذا قمت بحذف ملفات obj الحالية وأحضرت ملفات obj من جهاز آخر، فلن يظهر الخطأ.هذا هو مجرد فكرتي.لا أعرف دلفي وليس لدي أي فكرة عن ملفات pas أو C++ Builder.

هل يقوم مشروعك بإنشاء ملف dll أو أي نوع من المكتبات الخارجية حيث يتم تعريف وظيفة System::TObject::NewInstance() وربطها بالثنائي؟

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