ورود

View Full Version : استفاده از یک کتابخانه کامپایل شده در کامپیلر دیگر !



shankimout
دوشنبه 24 دی 1386, 23:11 عصر
سلام ،

عنوان تاپیک شاید یکم نا مناسب باشه ، اگر مدیران صلاح دیدند عوضش کنند .

--

قرض از مظاحمت ، یه کتابخونه (http://barnamenevis.org/forum/showthread.php?p=450401#post450401)ای رو نوشتیم برای فارسی نویسی در LCD گرافیک برای AVR . از اونجایی که من اصلا از اون کامپایلری که خیلی محبوب شده ( میون دیگر دوستان ما ) خوشم نمیاد ، و برنامه هم رو در کامپایلر دیگه ای هم نوشتم ، میخواستم بدونم چطور میتونم از اون کتابخانه توی اون کامپایلر استفاده کرد تا بدرد بقیه هم بخوره ؟!

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

خوب بزارین واضح تر بگم ، حتما واقف هستید که فارسی نویسی معضل بزرگی هست که همه جا خودشو نشون میده !

خوب قدیم وقتی یکی میخواست توی GLCD فارسی بنویسه یک bitmap درست میکرد و توش یه با یه برنامه ویرایش عکس یه متن فارسی مینوشت و اون روی GLCD نشون میداد که مشکلات زیادی داره و اصلا اصولی هم نیست !

من برای پروژه خودم که یک میکرو کنترلر قرار یه سری اطلاعات رو از یه db تو PC بگیره و نشونش بده ( و البطه این اطلاعات فارسی هم هست ) همچین برنامه ای نوشتم . فارسی نویسی native .

---

من این برنامه رو به C و GNU99 نوشتم ! تحت محیط WinAVR . کمپایلر هم GCC هست .

خیلی از دوستان هم اکنون برروی CodvisonAVR اپروچ میکنند ! خوب هردوشون کامپایلر C هستند .

حالا ما چطور میتونیم کتابخونه مون رو در GCC کامپایل کنیم و در CodeVision ازش استفاده کنیم ؟!

شدنش که میدونم میشه ، کتابخونه باید با GCC کامپایل بشه و اون ور هم لینک بشه به اونیکی . و توابع رو در یه فایل هدر تعریف کنیم و ...

اما یه مشکل اینجاست ، که من نمیدونم اون کامپایلر CodeVision اصلا این قابلیت رو داره یا نه ! فکر هم نمیکنم که داشته باشه .

بگید چه باید کرد ؟!

میشه کتابخونه رو بعد از کمپایل diassembley کرد و اونور توابع ش رو فراخونی کرد ؟!

shankimout
سه شنبه 25 دی 1386, 17:33 عصر
این همه خوره سی ، هیچیکی ندونست ما باید چه کرد ؟!

ICEMAN
سه شنبه 25 دی 1386, 18:54 عصر
ببین میتونی library های که نوشتی رو به صورت .dll و .lib منتشر کنی با یه فایل header که prototype توابع توی library ها رو داره .
http://barnamenevis.org/forum/showthread.php?t=88396

وقتی هم که Compile میکنی یه فایل .obj میسازه میتونی بصورت static میتونی به پروژه ات Add کنی و توابعش رو Call کنی .

Nima_NF
سه شنبه 25 دی 1386, 19:12 عصر
1 - بعضی از کامپایلر ها ابزاری همراه خودشان دارند که dll ها و فایل های import library آن ها را برای استفاده در سایر کامپایلر ها تبدیل می کنند ، مثل ابزار dlltool برای تبدیل lib , dll توسط gcc/mingW به فایل های def. و .a
پس برای این کار باید دنبال ابزار مورد نظر خودتان بگردید که شاید توسط کامپایلر مورد نظر ارائه شده یا نشده باشد.

2 - راه دیگر هم (Dynamic Linking)، نهایت دقت و رعایت در استاندار های C در کد های dll خودتان هست ، تا شاید همه dll سازگار با سایر کامپایلر ها شود و سپس بدون استفاده از import library آن dll را در سایر کامپایلر ها با استفاده از توابعی مثل LoadLibrary و GetProcAddress استفاده کنید که کار کمی سخت تر می شود ولی با همان dll به تنهایی می توانید در کدها از آن استفاده کنید.

در هر حال همیشه تضمینی برای اجرا شدن کامل dll ها بدون مشکل برای استفاده در سایر کامپایلر ها به این شکل وجود ندارد ، به همین خاطر بهترین راه برای شرکت ها انتقال کد ها به کامپایلر های مورد نظر و سپس استفاده از آن ها (البته با شرط ایجاد تغییرات) و یا همین طور کامپایل مستقیم و مجدد آن ها برای همان کامپایلر.

ضمنا استاندارد COM برای همین منظور استفاده می شود تا بتوان کتابخانه هایی ساخت که بشود در سایر کامپایلر ها از آن ها استفاده کرد ، که بحثی پیشرفته تر و سخت تر از ساخت معمول dll ها است.

Nima_NF
سه شنبه 25 دی 1386, 19:20 عصر
شدنش که میدونم میشه ، کتابخونه باید با GCC کامپایل بشه و اون ور هم لینک بشه به اونیکی . و توابع رو در یه فایل هدر تعریف کنیم و ...اما یه مشکل اینجاست ، که من نمیدونم اون کامپایلر CodeVision اصلا این قابلیت رو داره یا نه ! فکر هم نمیکنم که داشته باشه .

در کامپایلر CodeVisionAVR مانند سایر کامپایلر ها برای لینک کتابخانه ها قسمتی برای این کار وجود دارد:
Paths <- C Compiler <- Configure <- Project

ICEMAN
چهارشنبه 26 دی 1386, 08:27 صبح
1 - بعضی از کامپایلر ها ابزاری همراه خودشان دارند که dll ها و فایل های import library آن ها را برای استفاده در سایر کامپایلر ها تبدیل می کنند ، مثل ابزار dlltool برای تبدیل lib , dll توسط gcc/mingW به فایل های def. و .a
پس برای این کار باید دنبال ابزار مورد نظر خودتان بگردید که شاید توسط کامپایلر مورد نظر ارائه شده یا نشده باشد.



DLL to Lib v2.00
از http://www.binary-soft.com/

shankimout
چهارشنبه 26 دی 1386, 09:17 صبح
static library فکر کنم کارمو راه میندازه .

Inprise
جمعه 28 دی 1386, 15:21 عصر
دقیقا Static Library تنها چیزی هست که به دردت نمیخوره . Static Library ها باینری فرمتهای مختلفی دارن و معمولا کامپایلرهای مختلف به دلائل تاریخی و فنی مختلف از فرمت خودشون استفاده میکنن . مایکروسافت از COFF و بورلند از OMF استفاده میکنه . اینها با هم سازگار نیستن . یعنی کتابخانه ای که در یکی ساخته بشه مستقیما در دیگری قابل استفاده نیست . در مورد GCC و خانواده اش هم اوضاع همینطور هست . اگر کتابخانه Static‌رو داری همانطور که در جوابهای قبلی گفته شده اول تبدیلش کن و بعد سعی کن ازش استفاده کنی ، مسئله Calling Convention رو هم در نظر بگیر. راه حل بهتر استفاده از Dynamic Library است ، یعنی روی ویندوز مثلا DLL . با هر کامپایلر سی ای که کار میکنی قاعدتا باید بتونه DLL بسازه . پروتو تایپ رو هم که خودت داری و میتونی راحت در هر کامپایلری ( نه فقط سی ) ازش استفاده کنی .

shankimout
سه شنبه 02 بهمن 1386, 10:17 صبح
اره ، متوجه شدم ، تو یه فروم خارجی مرتبط هم پرسیده بودم همه گفته بودن که راهی بجز تبدیل نیست .

dll هم اوصلا یه موضوع مرتبط به OS میشه و بخاطر اینکه پلاتفرمی که روش داریم کار میکنیم ( میکروکنترلر ) در حقیق OS نداره ! پس dll هم هیچ .

تبدیل هم عملا امکان پذیر نیست ، چون من از یک سری توابعی که فقط در avrlibc موجوده استفاده کردم و تو کتابخونه های CV خبری از اونا نیست . اavrlibc هم که یک static lib هست .