سؤال

لقد حصلت على هذا التطبيق MFC أنا أعمل على ذلك يحتاج إلى أن يكون جزءا لا يتجزأ من قاعدة البيانات.لذلك ذهبت بحثا عن بقعة, سريع "المضمن" قاعدة البيانات و تعثرت عبر سكليتي.

أنا خلقت DB مع ذلك ، وأنا إنشاء مكتبة ثابتة المشروع مع Visual Studio 2008.مشروع المكتبة سيتم استخدامها في المشروع الرئيسي.

في مشروع مكتبة, أنا خلقت فئة DBClass مع طريقة AddFeedToDB(CFeed f).مشروع المكتبة يستخدم .lib الملف من codeproject (cppsqlite3.lib).

عند ترجمة مكتبة ثابتة لا تم الكشف عن خطأ ، ولكن عندما أحاول استخدام المكتبة ملف المشروع الرئيسي في المشروع ، أحصل على هذا النوع من الأخطاء:

error LNK2019: unresolved external symbol "public:void __thiscall
   CppSQLite3DB::close(void)" (?close@CppSQLite3DB@@QAEXXZ 
   referenced in function "public: int __thiscall
   CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
   AddFeedToDB@CTalkingFeedsDB@@QAEHVCFeed@@PDB@Z

ما أنا في عداد المفقودين ؟

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

المحلول

هذا ما حدث معي أكثر من مرة أن اعتقدت الرمز XXX (أي ?close@CppSQLite3DB@@QAEXXZ) كان في استيراد ليب ، في حين الفعلية الرمز __impXXX (أي __imp?close@CppSQLite3DB@@QAEXXZ).

سبب خطأ linker ثم يمكن العثور عليها في تجميع خطوة:المترجم سوف تولد ?close@CppSQLite3DB@@QAEXXZ الرمز سيتم استيرادها ، حيث يجب أن توليد __imp?close@CppSQLite3DB@@QAEXXZ.وهذا غالبا ما يعني أن وظيفة الإعلان نفسه لم __declspec( dllimport ).والتي قد تكون ناجمة عن بعض preprocessor رمز لم يتم تعريف.أو __declspec لا يجري هناك على الإطلاق...

نصائح أخرى

وأنا أعلم أنه هو بالفعل 2 سنوات منذ هذا السؤال...لكن أنا في نفس الحالة هنا.تم إضافة جميع الملفات رأس...وأضاف ليب الدلائل..والحفاظ على وجود هذا الخطأ.لذا إضافتها يدويا lib إلى تكوين خصائص -> رابط -> الإدخال -> اديتيونال تبعيات و كل يعمل بالنسبة لي.

لا أعرف إذا كان هذا هو الحال, ولكن عفريت بادئة قد يعني أنك تقوم بتجميع x64 المكتبة في مشروع Win32.

تحتاج إما إلى الرابط codeproject سكليتي lib إلى قابل للتنفيذ ، أو أن تشمل مصادر الملفات في المشروع الخاص بك مباشرة.(أي واحدة فعلت؟)

وأود أن تتبع هذه الخطوات:

  1. التفكير في ما مكتبة أو .الملف obj تتوقع رمز التي يتم تصديرها من قبل.

  2. تحقق ما إذا كان في الواقع لا تصدير هذا الرمز (التحقق من شخصية الحكيم).في بعض الأحيان استدعاء يختلف.

  3. تحقق مما إذا كانت المكتبة تتوقع أن تحتوي على الرمز المعروف رابط أولا التحقق من 'مكتبات إضافية' ، ثم تحقق إذا كانت المكتبة هو في الواقع وجدت (أنا في الغالب القيام بذلك عن طريق استخدام filemon.exe من sysinternals والبحث عن link.exe لفتح ملف lib.)

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

مترجم ورابط لن رابط مكتبة واحدة في آخر (ما لم يكن أحد DLL).تحتاج إلى تحديد كل المكتبات (cppsqlite3.ليب الخاصة بك مكتبة ثابتة) في المشروع الرئيسي.

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