# Native Code > برنامه نویسی با C > برنامه نویسی با MFC و ++Visual C > سوال: C run-time library

## Jenab4372

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


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

----------


## Nima_NF

موردی که من مطرح کردم تنها نکته ای برای مقاله شما بود که مجددا اینجا توضیحاتی می دهم.

اول اینکه باید نوع پروژه مشخص شود، که پروژه شما از نوع 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/sh...d.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

اتفاقا این بحث سوال من هم بود!!!
برای ایجاد پروژه در win32 به شکل static library باید چه کرد؟ آیا مراحل شبیه همینه؟

----------


## Nima_NF

> اتفاقا این بحث سوال من هم بود!!!
> برای ایجاد پروژه در win32 به شکل static library باید چه کرد؟ آیا مراحل شبیه همینه؟


برای win32 فقط باید مورد دوم را انجام دهید، یعنی همان سوپیچ /MT

----------


## nickaein.i

اگه به صورت Static کامپایل کنید، کدهای C runtime library داخل همون فایل EXE قرار میگیرن و مشکل حل میشه. البته من با VS2005 و VS2008 امتحان کردم.

----------


## Jenab4372

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


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

ممنون

----------


## Nima_NF

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


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

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

----------

