خطأ فادح LNK1127: المكتبة فاسدة -> بعد إضافة "C" للعمل النموذج الأولي

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

سؤال

لدي مكتبة خارجية مصنوعة باستخدام رمز C. أرغب في استدعاء وظيفة من المكتبة في مشروع C ++ الخاص بي. كان التنسيق الأصلي للنموذج الأولي للوظيفة.

extern void butterThreeBp(real_T eml_dt, real_T eml_fl, real_T eml_fu, real_T eml_b3[7], real_T eml_a3[7]);

وهذا تسبب في خطأ الرابط التالي في MSVC2008

error LNK2019: unresolved external symbol "void __cdecl butterThreeBp(double,double,double,double * const,double * const)" (?butterThreeBp@@YAXNNNQAN0@Z) referenced in function "public: void __thiscall myThread::setDRNLc(double)" (?setDRNLc@myThread@@QAEXN@Z)

ثم غيرت هذا النموذج الأولي إلى

extern "C" void ...

ثم احصل على الخطأ التالي:

\butterThreeBp.lib : fatal error LNK1127: library is corrupt

لقد أعيد بناء المكتبة عدة مرات وأنا متأكد من أنها ليست فاسدة. أي مساعدة ستكون رائعة. شكرًا!!

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

المحلول

ليس عليك استخدام برنامج التحويل البرمجي LCC المضمون مع MATLAB. أبسط حل هو الحصول على MATLAB لاستخدام VC ++. http://www.mathworks.com/support/compilers/r2010b/index.html

نصائح أخرى

IIRC يجب عليك إضافة Extern "C" فقط عند التجميع باستخدام برنامج التحويل البرمجي C ++.

شئ مثل هذا:

#ifdef __cplusplus
extern "C" {
#endif

// the declarations

#ifdef __cplusplus
}
#endif  

فهمتك! لقد أنشأت رمز المكتبة باستخدام المبرمج المدمج MATLAB وكنت تستخدم LCC من MATLAB المدمج في برنامج التحويل البرمجي لإنشاء المكتبة. أنا أعمل على التطبيق الرئيسي في MSVC ، لذلك أعتقد أنه يجب أن يكون هناك مشكلة في اتفاقية الاتصال بين المكتبة (LCC) ومشروعي الرئيسي (MSVC). كان من الصعب تحديد هذه المشكلة بشكل خاص لأن إحدى مكتباتي (butteronelp) كانت تعمل بشكل جيد ، على الرغم من أنها تم إنشاؤها باستخدام LCC. ومع ذلك ، لم تنجح مكتبة أخرى.

تم إصلاح المشكلة باستخدام

mex -setup

. . . أمر في MATLAB وتغيير المترجم الافتراضي إلى MSVC بدلاً من LCC الافتراضي.

أعتقد أن LCC يعتمد على GCC ، لذلك إذا كان أي شخص يعرف كيفية تغيير اتفاقية الاتصال في رمز C ++ بحيث يمكن استدعاء مكتبات GCC/LCC من MSVC ، فسيكون ذلك رائعًا. ومع ذلك ، هذا سؤال مختلف تمامًا إلى النسخة الأصلية على المنشور.

تتمثل الأخلاقية في هذه القصة في التحقق من أن مكتبتك وتطبيق الاتصال تم بناؤها باستخدام نفس المترجم إذا حصلت على "خطأ فادح LNK1127: المكتبة فاسدة".

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