PDA

View Full Version : تشخیص فایل های مورد نیاز از سورس



drsina
پنج شنبه 26 شهریور 1394, 12:24 عصر
چه جوری میشه فایل های dll ای که یه پروژه ی C++ از اونها استفاده میکنه رو تشخیص داد که همراه فایل ارائه بدم ؟!
من با dependency walker کار کردم ولی دقیقا اون چیزی رو که میخوام نمیده .
بالافرص یه پروژه دارم روو کامپیوتر خودم به خوبی کار میده ولی وقتی جایی دیگه میبرم اررو میده و مثلا فایل msvcr120 رو میخواد که باید دانلود کنم و اون توو system32 یا پهلوی برنامه بزارم .

جالب اینجاست که هر دفعه هم یه نوع فایل msvcr و msvcp میخواد :لبخند:

rahnema1
پنج شنبه 26 شهریور 1394, 14:08 عصر
سلام
این طور که از سوال بر میاد لازمه vcredist را هم به همراه برنامه در سیستم مورد نظر نصب کنید لطفا لینک زیر را مشاهده کنید که توضیحات کاملتر داده:
https://msdn.microsoft.com/en-us/library/ms235299.aspx

ali chegini
جمعه 27 شهریور 1394, 00:17 صبح
سلام.لطفا اینم ببین
لینک (http://www.codeproject.com/Tips/851725/Visual-Cplusplus-How-to-Create-Standalone-Win-Appl)

کامبیز اسدزاده
جمعه 27 شهریور 1394, 11:09 صبح
سلام

این بستگی به کامپایلر داره دوست عزیز

در کل بر اساس کتابخانه هایی که موجود هستش به موارد زیر باید توجه کنیم.

ابتدا باید بگم C++‎‎‎‎‎‎‎ در اصل شامل فقط فایل های msvcp و msvcr نیست و باید در نظر بگیریم این دو فایل زمانی مورد نیاز هستش که شما از کامپایلر MSVC که برای ویندوز و انحصار مایکروسافت استفاده کنید بنابراین این دیدگاه رو داشته باشید که فقط در کامپیالر مربوط به ویندوز این دو فایل رو لازم داریم و در ادامه توضیحات تکمیلی رو میدم.

فایل msvcpxxx.dll از نام / نسخه و پسوند مشخص میشه یعنی msvcp مخفف :Microsoft Visual C++‎ هستش و در انحصار مایکروسافت و کامپایلر MSVC قرار داره گزینه xxx عددی است که مشخص کننده نسخه کامپایلر هستش که معمولا با نسخه VS همخوانی داره و پسوندش هم که مشخصه dll مخفف dynamic link library هستش و مخصوص پلتفرم ویندوز.

فایل msvcrxxx.dll از نام / نسخه و پسوند مشخص میشه یعنی msvcr مخفف : Microsoft Visual C++‎‎‎‎‎‎‎ Runtime هستش و در انحصار مایکروسافت و کامپایلر MSVC قرار داره گزینه xxx عددی است که مشخص کننده نسخه کامپایلر هستش که معمولا با نسخه VS همخوانی داره و پسوندش هم که مشخصه dll مخفف dynamic link library هستش و مخصوص پلتفرم ویندوز.

نسخه این فایل ها بر اساس نیاز و نوع کامپایلر مشخص میشه به صورت زیر :



در صورت کامپایل برنامه در محیط Visual Studio 2005 نسخه فایل های مورد نیاز vs=80 خواهد بود به این صورت : msvcp80.dll و msvcr80.dll
در صورت کامپایل برنامه در محیط Visual Studio 2008 نسخه فایل های مورد نیاز vs=90 خواهد بود به این صورت : msvcp90.dll و msvcr90.dll
در صورت کامپایل برنامه در محیط Visual Studio 2010 نسخه فایل های مورد نیاز vs=100 خواهد بود به این صورت : msvcp100.dll و msvcr100.dll
در صورت کامپایل برنامه در محیط Visual Studio 2012 نسخه فایل های مورد نیاز vs=110 خواهد بود به این صورت : msvcp110.dll و msvcr110.dll
در صورت کامپایل برنامه در محیط Visual Studio 2013 نسخه فایل های مورد نیاز vs=120 خواهد بود به این صورت : msvcp120.dll و msvcr120.dll
در صورت کامپایل برنامه در محیط Visual Studio 2015 نسخه فایل های مورد نیاز vs=120 خواهد بود به این صورت : msvcp140.dll و msvcr140.dl


حالا فرض کنیم ما از کامپایلر های دیگه ای استفاده میکنیم مثل MinGW که در اصل GCC هست و بر پایه ایستگاه های UNIX (X11) پیاده سازی شده خب در این صورت دیگه خبری از msvc و msvcr نخواهد بود و با نصب gcc کتابخانه های استاندارد C++‎‎‎‎‎‎‎‎‎‎ در سیستم یونیکس قابل اجرا خواهد شد.

بر فرض اینکه از کتابخانه مشخصی مثلا مثل Qt استفاده میکنیم نیاز هستش تا فایل هایی مورد نیاز اون رو نیز داشته باشیم مثل : Qt5Core.so و ... یا کتابخانه های دیگه ای مثل Poco که فایل های مثل PocoFoundationd.so و ... رو نیاز دارند.


یک توضیح در رابطه با نکته ای شاید جزئی ولی بسیار مهم ! فرض کنید برنامه شما به صورت Debug در MSVC2012 کامپایل شده در این صورت به نظر شما برنامه با وجود فایل های
msvcp110.dll و msvcr110.dll اجرا خواهد شد ؟ جواب خیر است !


نکته : حجم برنامه هایی که برای تست و بررسی و به صورت Debug انتشار میابند بیشتر از حجم برنامه با خروجی اصلی یعنی Release می باشد.
نکته دوم : دلیل حجم بالای حالت debug این هستش که در این نسخه برنامه قابلیت Debug را دارد و به دلیل اضافه شدن مواردی اضافی برای امکان ارائه خطایابی حجم این نسخه بالا تر و سرعت اجرایی نیز پایینتر میباشد.

در اینجا باید به اینهم توجه داشته باشیم که حالت کامپایل برنامه نیز مهم است به عنوان مثال اگر ما به صورت Debug برنامه رو کامپایلر میکنیم باید فایل های msvcp110d.dll و msvcr110d.dll در کنار برنامه موجود باشند به کلمه d توجه کنید هر کتابخانه ای که به صورت دیباک کامپایل بشه با حرف d به صورت پیشفرض خروجی آن مشخص و شامل حجم بیشتری نسبت به حالت Release میباشد و بر عکس نسخه نهای یک برنامه باید به صورت Release کامپایل شود که بدون وجود کلمه d مشخص و حجم کلی آن پایینتر است.

پس این رو هم در نظر بگیرید که در اصل C++‎‎‎‎‎‎‎ بر اساس نوع سیستم عامل و نوع کامپایلر فایل های lib رو نیاز خواهد داشت حال اینکه در زبانی مثل C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎‎‎‎‎ وقتی کتابخانه .NET رو نصب میکنیم تمامی فایل های مورد نیاز در خود سیستم عامل نصب میشوند تا برنامه های نوشته شده تحت چنین زبانی قابل اجراء شوند که برای C++‎‎‎‎‎‎‎ هم بر اساس نسخه های موجود پکیجی با نام Visual C++‎‎‎‎‎‎‎‎‎‎ Redistributable Packages رو فراهم میکنند تا با نصب اون در سیستم عامل دیگر نیازی نیست شما این دو فایل msvc و msvcr رو در کنار برنامه کپی کنید.

ولی به یک نکته بر اساس تجربه شخصی اشاره میکنم سعی کنید فایل های مورد نیاز مثل همین dll ها رو همیشه در کنار برنامه یعنی فایل اجرائی داشته باشید در این صورت بعد از نصب آن در هر سیستمی که حتی پکیج پیشنهاد شده موجود و نصب نشده باشد برنامه شما بدون مشکل اجرا خواهد شد چرا که معروفترین برنامه ها از همین قانون پیروی میکنند مگر اینکه در هنگام نصب همون پکیج پیشنهادی رو هم برای نصب در اختیار Client قرار دهند.

negative60
جمعه 27 شهریور 1394, 14:42 عصر
در MSVC اگر پروژه مورد نظر رو به صورت استاتيک کامپايل کنيد برنامه شما standalone ميشه و نيازی به اين dll ها و يا نصب vcredist نيست
البته اگر از کتاب خانه ديگه اي تو پروژه استفاده کنيد اون رو هم بايد به صورت استاتيک کامپايل کنيد در غير اين صورت نياز به dll کتابخانه مورد نظر هست