PDA

View Full Version : آموزش: آموزش افزودن کتابخانه در محیط Visual Studio



کامبیز اسدزاده
چهارشنبه 29 مرداد 1393, 13:11 عصر
با سلام دوستان ؛

به خاطر درخواست های مکرر در رابطه با نحوه افزودن کتابخانه به 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 مربوط رو میزنم به صورت زیر :


122475


بعد پنجره زیر باز میشه که به دو روش میشه libs و includes هارو بهش مشخص کرد که ساده ترینش همینه که دارم توضیح میدم.

122476

روی گزینه Include directories کبیک کنید و گزینه edit رو بزنید...

122477



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





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


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


122479

کامبیز اسدزاده
چهارشنبه 29 مرداد 1393, 13:14 عصر
122484

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

122483



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

122482

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

کردم تا libs های لازم در پوشه lib بشه طبق تصویر زیر : 122481
2. بعد از کامپایل و تولید lib حتما باید مد کامپایل رو توجه داشته باشید که اگر debug هست باید کتابخانه هم از نوع debug کامپایل بشه که معمولا در اینصورت حرف d به اخر خروجی اضافه میشه مثل PocoNetd.lib یا مثلا در Qt داریم QtCored.dll یا ... پس کلا به اینم توجه کنید که در حالت ریلیز و دیباگ متفاوت هستش.
3. و یک گزینه که بعد از کامپایل کل پروژه با موفقیت برای اینکه بخواهید فایل dll مربوط به کتابخانه رو در کنار پروژه قرار بدین کافیه وارد پوش bin مثلا در همین کتابخانه بشید تا فایل خروجی با پسوند dll رو دریافت کنید طبق تصویر زیر :

122480
و در آخر باید خدمت شما عرض کنم که در رابطه با همه کتابخانه ها همین روش جوابگو هست فقط اگه مشکلی در کامپایل خود کتابخانه داشته باشید یا یکی از پیش نیاز های اون رو به درستی کامپایل نکنید ممکنه با خطا موجه بشید مثلا من در این پروژه برای اینکه از Net استفاده کنم مجبور شدم یکبار هم PocoFoundationd رو کامپایل و اون رو هم وارد Additional includes کنم تا مشکل حل بشه ! پس به این نکات ریز هم دقت کنید.

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

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

dasssnj
چهارشنبه 29 مرداد 1393, 13:56 عصر
سلام من فایل های 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 )

کامبیز اسدزاده
چهارشنبه 29 مرداد 1393, 14:13 عصر
سلام من فایل های 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
چهارشنبه 29 مرداد 1393, 14:46 عصر
آهان .
من می خوام فایل های کتابخانه ی جاوا 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;


}

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

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

dasssnj
چهارشنبه 29 مرداد 1393, 15:31 عصر
jni حله ولی jawt بازم ارور داره .

dasssnj
پنج شنبه 30 مرداد 1393, 05:59 صبح
ببخشید فرق کتابخانه های lib با dll چیه ؟

کامبیز اسدزاده
پنج شنبه 30 مرداد 1393, 10:17 صبح
ببخشید فرق کتابخانه های lib با dll چیه ؟

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

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

dasssnj
پنج شنبه 30 مرداد 1393, 13:54 عصر
نحوه ی اضافه کردن dll را هم بگید لطفا .

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

کامبیز اسدزاده
پنج شنبه 30 مرداد 1393, 14:29 عصر
نحوه ی اضافه کردن dll را هم بگید لطفا .

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

نحوه اضافه کردن dll که گفتم وقتی شما کتابخانه رو Compile میکنی در پوشه پیشفرض مثلا bin میتونید فایل dll رو پیدا کنید و در کنار فایل اجرایی قرار بدین و اگه از dll خارجی و نامربوط به پروژه رو میخواهید وارد پروژه کنید در این صورت این لینک رو هم ببینید : http://stackoverflow.com/questions/847396/compile-a-dll-in-c-c-then-call-it-from-another-program

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

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

106377529
سه شنبه 10 شهریور 1394, 11:46 صبح
سلام من یک سوال دارم ممنون میشم راهنمایی کنید، من DEVC++ رو نصب کردم و حالا می خوام از کتابخونه boost استفاده کنم (boost_1_33_1). این فایلی که من از boost دارم libs داره ولی include نداره. میشه لطفا بگید توی devc++ چه طور میشه این ها رو لینک کنم.

amirkarimi113
شنبه 14 اردیبهشت 1398, 11:48 صبح
این مراحلی اینجا گذاشتین هم توی ویژوال کد استودیو میشه پیاده سازی کرد یا نه فقط خاصه ویژوال استودیو هستش؟