# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C > آموزش: آموزش افزودن کتابخانه در محیط Visual Studio

## کامبیز اسدزاده

*با سلام دوستان ؛
*
به خاطر درخواست های مکرر در رابطه با نحوه افزودن کتابخانه به *C++‎‎‎‎‎‎‎‎‎‎‎‎* و استفاده از آن ها تصمیم گرفتم یک آموزشی سریع و نه چندان حرفه ای و خلاصه در رابطه با این موضوع ارائه بدم انشالله مفید باشد تا شاید پست های تکراری در رابطه با این موارد نبینیم.

خب میرم سر اصل مطلب همانطور که میدانید زبان C/C++‎‎‎‎‎‎‎‎‎‎‎‎ یکی از قابلیت هایی که نسبت به زبان های دیگری مانند C#‎‎‎‎‎‎‎‎‎‎‎‎ یا غیره داره نامحدود بودن استفاده از کتابخانه های این زبان هست که به صورت پیشفرض کتابخانه های استاندارد و از قبل تعریف شده در زبان C++‎‎‎‎‎‎‎‎‎‎‎‎ قابل استفاده هستند مانند کلاس های *iostream* و ... که کاملا پیشفرض روز این زبان ارائه شده است.
حالا در رابطه با این موضوع باید توضیحی بدم که اگر برنامه نویس یا توسعه دهنده ای نیازمند استفاده از کتابخانه ای منحصربفرد رو داره میتونه اون رو به زبان C++‎‎‎‎‎‎‎‎‎‎‎‎ اضافه کنه و ازش استفاده کنه برای مثال من برای کار با شبکه و اینترنت کتابخانه POCO رو ترجیح میدم پس برای استفاده از این ابتدا باید پیکربندی و آماده سازی لازم رو انجام بدم به صورت زیر عمل میکنم.

ابتدا کتابخانه رو دانلود میکنم و در مسیر مقابل به صورت دلخواه قرار میدم : *C:\poco-1.5.3-all
*قبل از هر چیزی باید بدونید که هر کتابخانه دارای libs و include هستش هر نوع کتابخانه ای که دانلود کنید این دو تا گزینه رو باید داشته باشه که بعد از کامپایل کتابخانه فایل lib و dll هاش در ویندوز یا Linux ایجاد خواهد شد.

من به دلیل پیچیده بودن کتابخانه *POCO* (پوکو) رو انتخاب کردم چون شامل کتابخانه های مربوط به Net و ... هستش که برای آموزش هدف من کار با Net هست بنابراین پوشه های include و libs در کنار هم نخواهند بود لذا include مربوط به هر کتابخانه در داخل خودش قرار گرفته.

خب یه پروژه با نام *ExternalLibs* ایجاد میکنم و روی پروژه راست کلیک و گزینه *Properties* مربوط رو میزنم به صورت زیر :

1.png

بعد پنجره زیر باز میشه که به دو روش میشه libs و includes هارو بهش مشخص کرد که ساده ترینش همینه که دارم توضیح میدم.
2.jpg
روی گزینه *Include directories* کبیک کنید و گزینه edit رو بزنید...
3.png


حالا روز علامت *new* کلیک کنید به صورت زیر :


 
من نسبت به مسیر کتابخانه مورد نظرم روی سیستم خودم آدرس مقابل رو میدم : : *C:\poco-1.5.3-all\Net\include*
خب تا اینجا کار تمومه میریم سراغه lib به صورت زیر طبق روش قبل :

4.pngمسیر رو میدم به صورت مقابل : : C:\poco-1.5.3-all \lib و بعد گزینه Apply و Ok

5.png

----------


## کامبیز اسدزاده

6.png
حالا کتابخانه من باید آماده استفاده باشه به صورت زیر آزمایش میکنم :
7.png


میبینیم که *INCLUDE* به درستی عمل کرده...
و در نهایت به صورت زیر بدون مشکل کامپایل خواهد شد...
8.png
*این یک روش ساده برای یکی از کتابخانه های* *C++‎‎‎‎‎‎‎** هستش شما میتونید طبق همین روش نسبت به کتابخانه های دیگه نیز اقدام کنید.*
*فقط نکات قابل توجه رو رعایت کنید :*1.       بعد از دانلود کتابخانه حتما باید کامپایل و بیلد بشه برای مثال در این کتابخانه من وارد پوشه C:\poco-1.5.3-all\Net\ شدم و کتابخانه رو توسط MSVS باز کردم و کامپایلش 

کردم تا libs های لازم در پوشه lib بشه طبق تصویر زیر : 9.png
2.       بعد از کامپایل و تولید lib  حتما باید مد کامپایل رو توجه داشته باشید که اگر debug هست باید کتابخانه هم از نوع debug کامپایل بشه که معمولا در اینصورت حرف *d* به اخر خروجی اضافه میشه مثل PocoNet*d*.lib یا مثلا در Qt داریم QtCore*d*.dll یا ... پس کلا به اینم توجه کنید که در حالت ریلیز و دیباگ متفاوت هستش.
3.       و یک گزینه که بعد از کامپایل کل پروژه با موفقیت برای اینکه بخواهید فایل dll مربوط به کتابخانه رو در کنار پروژه قرار بدین کافیه وارد پوش bin مثلا در همین کتابخانه بشید تا فایل خروجی با پسوند dll رو دریافت کنید طبق تصویر زیر :
10.pngو در آخر باید خدمت شما عرض کنم که در رابطه با همه کتابخانه ها همین روش جوابگو هست فقط اگه مشکلی در کامپایل خود کتابخانه داشته باشید یا یکی از پیش نیاز های اون رو به درستی کامپایل نکنید ممکنه با خطا موجه بشید مثلا من در این پروژه برای اینکه از Net استفاده کنم مجبور شدم یکبار هم PocoFoundationd رو کامپایل و اون رو هم وارد Additional includes کنم تا مشکل حل بشه ! پس به این نکات ریز هم دقت کنید.

در رابطه با wxWidget و یا Qt و هر کتابخانه دیگه هم به همین صورت میتونید اقدام کنید ولی Qt با داشتن Addons کارش راحتره که قبلا توضیح دادم و آموزشش رو ارائه دادم.

مارو دعا کنید شاد و پیروز باشید.
مشکلی بود مطرح کنید حلش میکنیم خیالتون تخت.

----------


## dasssnj

سلام من فایل های lib و h را اضافه کردم ولی این ارور را میده :

1>dllmain.obj : error LNK2019: unresolved external symbol __imp__JAWT_GetAWT@8 referenced in function "long __stdcall Java_de_xhelp_jsevenbar_core_JSevenBar_getWindowHa  ndle(struct JNIEnv_ *,class _jclass *,class _jobject *)" (?Java_de_xhelp_jsevenbar_core_JSevenBar_getWindow  Handle@@YGJPAUJNIEnv_@@PAV_jclass@@PAV_jobject@@@Z  )

----------


## کامبیز اسدزاده

> سلام من فایل های lib و h را اضافه کردم ولی این ارور را میده :
> 
> 1>dllmain.obj : error LNK2019: unresolved external symbol __imp__JAWT_GetAWT@8 referenced in function "long __stdcall Java_de_xhelp_jsevenbar_core_JSevenBar_getWindowHa  ndle(struct JNIEnv_ *,class _jclass *,class _jobject *)" (?Java_de_xhelp_jsevenbar_core_JSevenBar_getWindow  Handle@@YGJPAUJNIEnv_@@PAV_jclass@@PAV_jobject@@@Z  )


از چه کتابخانه ای استفاده میکنی؟
دقیقا بگو ببینم میخوای چیکار کنی؟

----------


## dasssnj

آهان .
من می خوام  فایل های کتابخانه ی جاوا JDK را اضافه کنم و برای جاوا dll بنویسم .
برای jni  مشکلی ندارم ولی برای jawt.lib و jawt.dll اون ارور را میده. 


اینم کدمه :

#include "pch.h"
#include <jni.h>
#include <jawt_md.h>
BOOL APIENTRY DllMain(HMODULE /* hModule */, DWORD ul_reason_for_call, LPVOID /* lpReserved */)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
JNIEXPORT jint JNICALL Java_de_xhelp_jsevenbar_core_JSevenBar_getWindowHa  ndle(
	JNIEnv * env, jclass cls, jobject component) {




	JAWT awt;
	JAWT_DrawingSurface* ds;
	JAWT_DrawingSurfaceInfo* dsi;
	JAWT_Win32DrawingSurfaceInfo* dsi_win;
	jboolean result;
	jint lock;
	awt.version = JAWT_VERSION_1_4;
	result = JAWT_GetAWT(env, &awt);
	if (result != JNI_FALSE) {
		ds = awt.GetDrawingSurface(env, component);
		if (ds != NULL) {
			lock = ds->Lock(ds);
			if ((lock & JAWT_LOCK_ERROR) == 0) {
				dsi = ds->GetDrawingSurfaceInfo(ds);
				dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
				if (dsi_win) {
					return (jint)dsi_win->hwnd;
				}
				return (jint)-1;
			}
			return (jint)-2;
		}
		return (jint)-3;
	}
	return (jint)-4;


}

----------


## کامبیز اسدزاده

برو قسمت Properties طبق آموزش بعد قسمت linker و بعد Input اینجا در داخل Additional Dependencies این رو اضافه کن : jawt.lib
آموزش های مشابه این رو هم ببین که همشون مربوط به java هست : http://www.javamex.com/tutorials/jni..._started.shtml

این jni رو هم دانلود نشد بکنم تا بررسی کنم خودم تجربه ای با این ندارم ولی روش افزودن کتابخانه در VS برای C++‎ همینی بود که گفتم.

----------


## dasssnj

jni حله ولی jawt بازم ارور داره .

----------


## dasssnj

ببخشید فرق کتابخانه های lib با dll چیه ؟

----------


## کامبیز اسدزاده

> ببخشید فرق کتابخانه های lib با dll چیه ؟


*کتابخانه های lib :* این نوع کتابخانه های از نوع (Static) هستند و هنگام کامپایل به برنامه اصلی همون فایل اجرایی اضافه یا همون لینک میشوند و دقیقا مانند کتابخانه های داینامیکی شامل کد هستند.

*کتابخانه های dll :* این نوع کتابخانه ها هم از نوع (Dynamic) هستند همانند استاتیک شامل کدهایی هستند و برای استفاده از اینها باید در خروجی گرفتن از پروژه این نوع فایل هارو نیز در کنار برنامه و فایل اجرایی قرار بدین و فقط در هنگام نیاز به کلاس یا کد و کتابخانه ای از این ها فراخوانی خواهند شد.

----------


## dasssnj

نحوه ی اضافه کردن dll را هم بگید لطفا .

یه سوال دیگه : 
خطای  unresolved external symbol  در چه مواقعی رخ میده ؟

----------


## کامبیز اسدزاده

> نحوه ی اضافه کردن dll را هم بگید لطفا .
> 
> یه سوال دیگه : 
> خطای  unresolved external symbol  در چه مواقعی رخ میده ؟


نحوه اضافه کردن dll که گفتم وقتی شما کتابخانه رو Compile میکنی در پوشه پیشفرض مثلا bin میتونید فایل dll رو پیدا کنید و در کنار فایل اجرایی قرار بدین و اگه از dll خارجی و نامربوط به پروژه رو میخواهید وارد پروژه کنید در این صورت این لینک رو هم ببینید : http://stackoverflow.com/questions/8...nother-program

و اما در مورد خطای unresolved external symbol زمانی رخ میده که شما کتابخانه ای رو به صورت External وارد پروژه میکنید و در صورت عدم لینک شدن کتابخانه به درستی اوناین خطارو خواهید دید که برای رفعش با رعایت اصول کامپایل کتابخانه و حتی معماری و مد کامپایلش با پروژه هماهنگ و در نهایت مشکل رو رفع کنید.

----------


## fhk.mehr66

سلام.من یک الگوریتم نوشتم که میخوام موازی اجرا بشه و اولش <include <omp.h
داره و موقع اجرا این ارور رو میده:
 fatal error C1083: Cannot open include file: 'omp.h': No such file or directory
میشه لطفا راهنمایی کنید؟

----------


## 106377529

سلام من یک سوال دارم ممنون میشم راهنمایی کنید، من DEVC++‎ رو نصب کردم و حالا می خوام از کتابخونه boost استفاده کنم (boost_1_33_1). این فایلی که من از boost  دارم libs داره ولی include  نداره. میشه لطفا بگید توی devC++‎ چه طور میشه این ها رو لینک کنم.

----------


## amirkarimi113

این مراحلی اینجا گذاشتین هم توی ویژوال کد استودیو میشه پیاده سازی کرد یا نه فقط خاصه ویژوال استودیو هستش؟

----------

