PDA

View Full Version : سوال: مشکل در مورد تنظیمات run-time library در ویژوال C++ ی 2008



feri88
شنبه 16 خرداد 1388, 14:54 عصر
سلام
من توی برنامه ام از یه کتابخونه(که با C++ نوشته شده) استفاده کردم که با سوئیچ
(run-time library ) ی /MDd
Multi-threaded Debug DLL)) کامپایل شده و بنابراین من هم سوئیچ برنامه ام رو این انتخاب کردم، در ضمن نوع فایل برنامه ام هم dll هستش.
وقتی با این شرایط برنامه ام رو کامپایل می کنم، حدود 41 تا ارور لینک با 2 تا وارنینگ می بینم که چند تا شو می ذارم:

1>------ Build started: Project: prog1, Configuration: Debug Win32 ------

1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$alloc ator@D@2@@std@@QAE@XZ) already defined in cryptlibd.lib(queue.obj)

1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$alloc ator@D@2@@std@@QAE@PBD@Z) already defined in cryptlibd.lib(queue.obj)

1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl std::operator+<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,char const *)" (??$?HDU?$char_traits@D@std@@V?$allocator@D@1@@std @@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$al locator@D@2@@0@ABV10@PBD@Z) already defined in cryptlibd.lib(osrng.obj)

1>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 cryptlibd.lib(integer.obj)

1>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)

1>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)

1>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)

1>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)

1>LIBCMTD.lib(tidtable.obj) : error LNK2005: __encode_pointer already defined in MSVCRTD.lib(MSVCR90D.dll)

1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __malloc_dbg already defined in MSVCRTD.lib(MSVCR90D.dll)

1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRTD.lib(MSVCR90D.dll)

1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRTD.lib(cinitexe.obj)


1>LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library

1>LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library

1>LIBCMTD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

……………………..
بعد اومدم اون کتابخونه رو با سوئیچ Multi-threaded Debug) /MTd) کامپایل کردم و سوئیچ برنامه ام رو هم همین کردم، حالا برنامه اجرا میشه ولی وسط های exe (یه exe دارم که توابع dll رو صدا می زنه!) یه بیغام assertion failure می یاد، به صورت زیر:


Debug Assertion Failed!
Program:d:\tester.exe
File:ff:\dd\vctools\crt_bld\self_x86\crt\src\dbghe ap.c
Line:1317
Expression: _CrtIsValidHeapPointer(pUserData)
من این خط از کد dbgheap.c رو نگاه کردم که به صورت زیر بود:

_
ASSERTE(_CrtIsValidHeapPointer(pUserData));
بعدش که توضیحات MSDN رو نگاه کردم، گفته بود که چون فایل برنامه من dll هستش و به صورت static لینک میشه(یعنی MTD )، در خارج از local heap هستش و برای رفعش باید به صورت داینامیک لینک بشه (یعنی MDd )!
اما بعد از اینکه سوئیچ رو داینامیک می کنم اون 41 ارور رو میده؛ به نظر شما چی کار باید بکنم که مشکلم حل بشه؟


(در ضمن من توی کامپیوتر دسکتاپم با سوئیچ داینامیک، برنامه رو اجرا کرم و نه اون 41 ارور رو داد و نه بیغام Assertion Failure ، ولی وقتی برنامه رو به لپ تاپم انتقال دادم، اون 41 ارور رو دیدم!
حالا دیگه نمی دونم چه تنظیماتی رو توی کامپیوتر دسکتاپ در ویژوال C++ انجام دادم که فقط توی لپ تاپ با این 41 ارور در مد داینامیک روبرو شدم، با اینکه خودم فکر می کنم تمام تنظیمات رو در هر دو به درستی انجام دادم، به نظر شما این مسئله ناشی از چیه؟)

خیلی ممنون

feri88
یک شنبه 17 خرداد 1388, 19:16 عصر
سلام
کسی نظری راجع به این مشکل نداره؟
خواهش می کنم کمک کنید، فقط امیدم به شماست!
اگه سوالم رو بد توضیح دادم، بگین تا واضح تر بگم
مرسی

Nima_NF
یک شنبه 17 خرداد 1388, 21:48 عصر
سوالتان خیلی گنگ هست، بدون سورس کد هم هیچ نظری نمی توان داد.

اگر می توانید قسمت های مهم سورس کد پروژه را حذف کنید و کل پروژه dll را Zip و ضمیمه کنید (بدون فایل های پرحجم ncb و ...) تا یک بررسی روی آن انجام دهم و در حالت MDd تست کنم.

feri88
دوشنبه 18 خرداد 1388, 20:46 عصر
سلام
دستتون درد نکنه، درست همین چند ساعت قبل مشکلم حل شد، مشکل توی فایل های اون کتابخونه ای بود که استفاده کرده بودم که شکر خدا حل شد.
بازم ممنون