سؤال

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

شكرًا

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

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
هل كانت مفيدة؟

المحلول

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

قد ترغب أيضًا في التفكير في استخدام "المراجع" بدلاً من "التبعيات"

يحرر:

بعد ما قمت بنشره يبدو أن ارتباطك بالمكتبات القياسية غير متناسق.هل يمكن أن يربط أحد المشروعات المكتبات القياسية بشكل ثابت بينما يربط البعض الآخر ديناميكيًا؟(راجع خصائص المشروع->الرابط) أو أحدهما لوقت تشغيل الإصدار والآخر لتصحيح الأخطاء؟(على الرغم من أن الأخير يجب أن يكون ممكنا، مع التحذيرات)

نصائح أخرى

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

من وثائق مايكروسوفت, "جميع الوحدات التي تم تمريرها إلى استدعاء معين للرابط يجب أن يتم تجميعها باستخدام نفس خيار برنامج التحويل البرمجي لمكتبة وقت التشغيل (/MD، /MT، /LD)."

حاول تغيير كافة المشاريع لاستخدام نفس الإصدار من مكتبة وقت التشغيل.في Visual Studio 2010 ، هذا في خصائص المشروع | خصائص التكوين | C/C ++ | توليد الكود | مكتبة وقت التشغيل.اختيار إما متعدد الخيوط التصحيح DLL أو تصحيح متعدد الخيوط (لتكوين التصحيح الخاص بك).

هل تم تصدير الوظائف الموجودة في مشاريعك الأخرى؟إذا لم يتم تصديرها، فلن يكون هناك أي شيء يمكن الارتباط به من ملف exe الرئيسي، مما قد يتسبب في حدوث الأخطاء.يرى التصدير من ملف DLL باستخدام __declspec(export) للمزيد من المعلومات.

الأخطاء التي تحصل عليها هي "خطأ LNK2005" حيث تم بالفعل تعريف رمز في المكتبة التي تقوم بربطها (msvcprtd.lib) في مكتبة أخرى (على سبيل المثال، Panels.lib).إذا قمت بإضافة Panels.lib إلى الحقل "تجاهل مكتبة معينة" (في خصائص التكوين VS2008--> الرابط--> الإدخال --> تجاهل مكتبات معينة)، فستتوقف الأخطاء.

أفترض أن أخطاء الرابط التي تحصل عليها تتعلق بـ "الرموز التي لم يتم حلها"؟

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

  1. انقر بزر الماوس الأيمن على المشروع، ثم حدد خصائص.
  2. حدد خصائص التكوين->رابط->الإدخال
  3. أدخل اسم المكتبة (على سبيل المثال.filename.lib) ضمن التبعيات الإضافية.

لقد واجهت مشكلة مشابهة جدًا لهذه المشكلة والتي تبين أنها بسبب أن إحدى مكتباتي لديها خيار "معاملة wchar_t كنوع مدمج" تم تعيينه على قيمة مختلفة عن المكتبات الأخرى.هذا الإعداد غير صحيح بشكل افتراضي في المشاريع الجديدة.تغيير كل منهم إلى صحيح حل المشكلة.

بالضبط، تم تجميع مشروع واحد على الأقل باستخدام "مكتبة وقت تشغيل" مختلفة عن المشاريع الأخرى.ربما قمت بإضافة واحدة جديدة باستخدام الإعداد الافتراضي المختلف.تحقق من خصائص مشروعك (مشاريعك) للحصول على قيمة متساوية لـ "خصائص التكوين" -> "C/C++" -> "إنشاء التعليمات البرمجية" -> "مكتبة وقت التشغيل".

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

في حالتي، لدي طريقتين:

  1. خصائص المشروع -> C/C++ -> إنشاء التعليمات البرمجية -> مكتبة وقت التشغيل. تغييره إلى MT.

  2. أضف مكتبة نقصك إلى: الرابط-> الإدخال-> التبعيات الإضافية. إذا لم ينجح الأمر، فحاول إضافة مسار كامل بدلاً من اسم المكتبة.

على سبيل المثال:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libvcruntime.lib؛

هذا يناسبني. أجب عن هذا السؤال لأي شخص يحتاج إلى المساعدة.

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