بلاگی در مورد دیجیتال،بینایی و یادگیری ماشین

طبقه بندی موضوعی

ساخت static library در ++C و استفاده از آن در C به کمک Class Wrapping

چهارشنبه, ۸ ارديبهشت ۱۳۹۵، ۱۱:۰۴ ب.ظ

درود و وقت بخیر

شاید برای شما هم پیش اومده باشه که نیاز داشته باشید به استفاده از static library ای که در زبان ++C که کلاس و آبجکت داره، نوشته شده، در زبان دیگه ای مثل C که کلاس و آبجکت رو پشتیبانی نمیکنه!

خب اینجاست که مفهوم Class Wrapping مطرح میشه.

روشی که بکمک اون، در سمت ++C ساختاری پیاده سازی میشه که از زبان C قابل استفاده باشه.


در ضمن static library در مقابل dynamic library هست. تفاوت این دو که پسوندشون به ترتیب lib و DLL هست، در زمان لود شدنشون به برنامه میزبان هست.

DLL در runtime توسط میزبان load میشه، در حالی که static library موقع بیلد شدن برنامه میزبان، ازش استفاده میشه.


بطور خلاصه هدف class wrapping، ایجاد دسترسی به عضو های کلاسی هست که در سی پلاس تعریف شده(از C به عنوان مثال)

برای اینکار، برای هر تابعی که در کلاس تعریف شده، یک تابع کمکی در خارج از کلاس ایجاد میکنیم. اینا به کنار، 2 تا تابع اضافی دیگه لازم داریم. 

1. تابع ایجاد یک شی از کلاس و برگردوندن اشاره گر بهش در return تابع

2.تابع حذف شی ایجاد شده توسط تابع بالایی


در واقع به کمک این 2 تا تابع، ساختار new <className> رو برای زبانی مثل C که شی گرا نیست، پیاده میکنم.


چندتا لینک خوب که این موضوع رو بررسی کردن، آورذم:

https://isocpp.org/wiki/faq/mixing-c-and-cpp

http://stackoverflow.com/questions/3583353/calling-c-class-member-function-from-c-code

http://www.iranled.com/forum/thread-30581.html

http://stackoverflow.com/questions/1588788/wrapping-c-class-api-for-c-consumption

http://www.jonathanbeard.io/tutorials/Mixed_C_C++.html



خب حالا بطور خلاصه کارایی که برای یه کلاس ++C لازمه انجام بشه تا در زبان C قابل استفاده باشه رو مرور میکنیم:


این فایل ++C همراه توابع wrapper برای کلاس:


//myclass_src.cpp
#include "wrapper.h"
class myclass
{
private:
int a,b;
public:
myclass(int init_val_a,int init_val_b)
{
a = init_val_a;
b = init_val_b;
}
int sum()
{
return a+b;
}
}
extern "C" void* myclass_create(int a, int b)
{
return new myclass(a,b);
}
extern "C" void  myclass_destroy(void*cls_ptr)
{
delete static_cast<myclass*>(cls_ptr);
}
extern "C" int myclass_sum(void *cls_ptr)
{
return static_cast<myclass*>(cls_ptr)->sum();
}


حالا چیزی که لازم داریم یه هدر فایل برای استفاده در c هست: 


//wrapper.h
#ifdef __cplusplus
extern "C" {
#endif
void* myclass_create(int init_val_a,int init_val_b)    ;
void myclass_destroy(void*cls_ptr)   ;
int myclass_sum(void *cls_ptr) ;
#ifdef __cplusplus
}
#endif


حال سمت C برای استفاده از static lib ای که با پسوند lib.* یا a.* ساخته شده:

  • باید فایل lib یا a رو به پروژه اضافه کنید(در keil بسادگی با add file کردن به پروژه -- در IAR بطور مشابه -- در ویژوال استودیو : از طریق project properties دنبال گزینه precompiled libraries باشید)
  • باید هدر فایل wrapper رو در پروژه C مدنظر، include کنید.

//Pure_C_Project.c
#include "wrapper.h"

int main
{
void* p_myclass;
int sum=-1;
p_myclass = myclass_create(1,3);
//-------------------------------
sum = myclass_sum(p_myclass);
//-------------------------------
myclass_destroy(p_myclass);
}


سوالی بود خوشحال میشم کمکی کرده باشم.
موفق باشید.

موافقین ۰ مخالفین ۰ ۹۵/۰۲/۰۸

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی