x64 كيفية ربط مكتبة ثابتة في فيسوال C++ 2008؟




visual c++ visual studio 2008 (3)

يبدو أن الدوال المصدرة في المكتبة الثابتة لها اتفاقية استدعاء خاطئة. كيف يبدو ملف رأس الوظائف المصدرة؟

حسنا، فإن الدالات تستخدم UDT_API كبادئة. يجب أن لا إذا كنت مجرد خلق ثابت. ليب للربط ضد.

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

يتضمن بلدي فك ++ الحل مشروعين، تطبيق (إيكس) ومكتبة ثابتة.

كلا تجميع غرامة، ولكن تفشل في الارتباط. أنا الحصول على خطأ "رمز خارجي لم تحل" لكل وظيفة من ثابت لي يمكنني استخدامها. وهي تبدو كما يلي:

MyApplication.obj: خطأ LNK2019: رمز خارجي لم يتم حله "__declspec (دليمبورت) إنت __cdecl ميستاتيكليبراري :: أسيبت (إنت، ستروكت سوكادر *، إنت *)"

التطبيق العثور على .lib على ما يرام، حتى أن هذه ليست القضية. أنا أفكر في "دليمبورت" هي المشكلة - لماذا سيكون هناك عندما أحاول بناء مكتبة ثابتة؟ يستخدم كل من التطبيق والمكتبة مكتبة التشغيل متعددة الترابط (/ مت) "لا" دل متعددة الخيوط (/ مد) ".

تصحيح:

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

#ifdef UDT_EXPORTS
   #define UDT_API __declspec(dllexport)
#else
   #define UDT_API __declspec(dllimport)
#endif

هل يعني هذا أنه لم يكن المقصود استخدامه كمكتبة ثابتة؟


كيف يتم إعداده للارتباط؟ ماذا يبدو ملف الرأس الخاص بك ل ميابليكاتيون و ميستاتيكليبراري :: قبول تبدو؟

إذا كان لديك كلا المشروعين في ملف الحل نفسه، فإن أفضل طريقة لإعداده لربط هو انقر بزر الماوس الأيمن فوق ملف الحل-> خصائص ثم قم بتعيين المكتبة كتبعية التطبيق. سوف فيسوال ستوديو التعامل مع الارتباط تلقائيا، وتأكد أيضا من أن بناء مكتبة محدثة عند بناء التطبيق الخاص بك.

هذا الخطأ كيندا يبدو وكأنه قد عرفت بأنها استيراد دل / تصدير في ملف رأس الخاص بك على الرغم من.

تحرير: نعم، هذه هي المشكلة. ربما قمت بإنشائه كمكتبة ديناميكية أولا؟ (أو من كتبه فعل.)

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

1) يمكنك فقط حذف كل هذه الأشياء، وأي معدلات UDT_API في التعليمات البرمجية.

2) يمكنك حذف تلك الأشياء وإضافة هذا السطر:

#define UDT_API

3) حل أكثر قوة هو تغييره إلى هذا:

#ifdef  UDT_STATIC
    #define UDT_API
#else
    #ifdef UDT_EXPORTS
       #define UDT_API __declspec(dllexport)
    #else
       #define UDT_API __declspec(dllimport)
    #endif
#endif

ثم قم بإضافة التوجيه بريبرويسور UDT_STATIC إلى المشاريع الخاصة بك عندما تريد استخدامه كمكتبة ثابتة، وإزالته إذا كنت ترغب في استخدامه كمكتبة ديناميكية. (ستحتاج إلى أن تضاف إلى كلا المشروعين.)


نظرا لأنك تعمل مع المقابس، تأكد من إضافة WS2_32.lib في التبعيات الإضافية للمشروع.