PDA

View Full Version : سوال: C run-time library



Jenab4372
یک شنبه 04 مرداد 1388, 08:31 صبح
++C فایلهاي متکی به خود می سازد. همین که برنامه تان را کامپایل و لینک کردید دیگر می توانید فایل exe را بدون هیچ دغدغه اي به دیگران بدهید.
این موضوع برای کامپایلرهای 10 سال قبل ++VC صادق هست. در کامپایلرهای جدید همواره نسخه C run-time library که برای کتابخانه های استاندارد زبان ++C/C هستند (تحت عنوان visual C++ libraries) باید در سیستم کاربر نصب شوند یا dll های مورد نیاز در کنار فایل اجرایی کپی شوند. (در هر حال این موارد کمتر از 3MB است )



سئوالي بسيار مهمي كه اينجا از شما دارم آيا در صورتي كه پروژه به صورت static library كامپايل شود هم چنين است؟ يعني باز اين كتابخانه ها را بايد نصب كرد يا خير؟:متفکر:

Nima_NF
یک شنبه 04 مرداد 1388, 22:14 عصر
موردی که من مطرح کردم تنها نکته ای برای مقاله شما بود که مجددا اینجا توضیحاتی می دهم.

اول اینکه باید نوع پروژه مشخص شود، که پروژه شما از نوع MFC هست.

پروژه های MFC نیازمند دو دسته کتابخانه هستند:
1- کتابخانه های MFC
2- کتابخانه های C run-time

اگر پروژه ای قرار هست کلا بدون نیازمندی به dll ای ساخته شود باید هر دو مورد فوق به صورت static لینک شوند نه فقط کتابخانه های MFC.

در مقاله، مورد اول را در Properties از طریق Use MFC in a static library لینک کردید.
اما مورد دوم را ذکر نکردید، یعنی :



Project -> Properties ->C/C++ -> Code Generation -> Runtime library -> /MT

هر چند که با اعمال مورد اول، مورد دوم نیز خودکار معمولا توسط کامپایلر تنظیم می شود، اما تنها جهت محکم کاری باید آن را چک کرد.

در هر دو مورد فوق لینک کردن به شکل static معایب و محدودیت هایی دارد که به برخی از آن ها در لینک زیر اشاره کرده ام:
http://www.barnamenevis.org/forum/showthread.php?t=151958

پس اگر این دو مورد انجام شوند آنگاه فایل اجرایی بی نیاز به نصب کتابخانه ای هست، اما باید محدودیت های احتمالی را در نظر بگیرید و در جای درست به شکل static برنامه را عرضه کنید.


در پایان مطلبی از توصیه های مایکروسافت جهت استفاده نکردن از حالت static linking تا جای ممکن:





Prefer dynamic linking over static linking:
It is not recommended to redistribute C/C++ applications that statically link to Visual C++ libraries. It is often mistakenly assumed that by statically linking your program to Visual C++ libraries it is possible to significantly improve the performance of an application. However the impact on performance of dynamically loading Visual C++ libraries is insignificant in almost all cases. Furthermore, static linking does not allow for servicing the application and its dependent libraries by either the application's author or Microsoft. For example, consider an application that is statically linked to a particular library, running on a client computer with a new version of this library. The application still uses code from the previous version of this library, and does not benefit from library improvements, such as security enhancements. Authors of C/C++ applications are strongly advised to think through the servicing scenario before deciding to statically link to dependent libraries, and use dynamic linking whenever possible.


همان طور که می بینید رفع نواقص یا حتی موارد امنیتی که توسط windows update انجام می شوند در حالت static دیگر قابل اعمال نیستند.

emadfa
دوشنبه 05 مرداد 1388, 14:25 عصر
اتفاقا این بحث سوال من هم بود!!!
برای ایجاد پروژه در win32 به شکل static library باید چه کرد؟ آیا مراحل شبیه همینه؟

Nima_NF
دوشنبه 05 مرداد 1388, 19:15 عصر
اتفاقا این بحث سوال من هم بود!!!
برای ایجاد پروژه در win32 به شکل static library باید چه کرد؟ آیا مراحل شبیه همینه؟
برای win32 فقط باید مورد دوم را انجام دهید، یعنی همان سوپیچ /MT

nickaein.i
سه شنبه 13 مرداد 1388, 23:15 عصر
اگه به صورت Static کامپایل کنید، کدهای C runtime library داخل همون فایل EXE قرار میگیرن و مشکل حل میشه. البته من با VS2005 و VS2008 امتحان کردم.

Jenab4372
جمعه 27 شهریور 1388, 11:05 صبح
در کامپایلرهای جدید همواره نسخه C run-time library که برای کتابخانه های استاندارد زبان ++C/C هستند (تحت عنوان visual C++‎ libraries) باید در سیستم کاربر نصب شوند یا dll های مورد نیاز در کنار فایل اجرایی کپی شوند. (در هر حال این موارد کمتر از 3MB است )


من يك پروژه MFC با VC2008 دارم كه ميخوام اون رو روي يك سيتم ديگر اجرا كنم مي شود اين كتباخانه هاي c run-tim و MFC رو برام توي يك فايل زيپ قرار بديد تا در پوشه برنامه ام در سيتم هدف كپي نمايم.

ممنون

Nima_NF
شنبه 28 شهریور 1388, 00:35 صبح
من يك پروژه MFC با VC2008 دارم كه ميخوام اون رو روي يك سيتم ديگر اجرا كنم مي شود اين كتباخانه هاي c run-tim و MFC رو برام توي يك فايل زيپ قرار بديد تا در پوشه برنامه ام در سيتم هدف كپي نمايم.

ممنون
در کامپایلرهای نسخه 2005 و 2008 باید یک setup برای برنامه خود بسازید، dll ها خودکار تشخیص داده می شوند و در پروژه setup اضافه می شوند.
نسخه آینده یعنی 2010 مجددا این امکان را می دهد که Dll ها را در کنار فایل اجرایی کپی کنید.

در هر حال در صورت نیاز می توانید پروژه را به شکل static کامپایل کنید (اگر ضروری هست)