2009-07-01 10 views
19

C++ kitaplıklarından C sarmalayıcıları oluşturmak istiyorum. Orada elle nasıl yapılacağına ilişkin öğreticiler şunlardır:C++'dan C sarıcı mı üretelim?

Ama bu el emeği çok fazladır. Bunun Örneğin

:

Yazmam gereken
struct RtAudio { 
    virtual DeviceInfo const& f() {...} 
    class DeviceInfo { 
     virtual void g() { ... } 
    }; 
    ... 
}; 

:

struct RtAudioC { 
    RtAudio x; 
}; 
struct DeviceInfo { 
    RtAudio::DeviceInfo x; 
}; 
extern "C" { 
    RtAudioC* newRtAudio() { 
     return new RtAudioC; 
    } 
    void deleteRtAudio(RtAudioC *p { 
     delete p; 
    } 
    /* do something with RtAudio::f() */ 
    void g(DeviceInfo *p) { 
     try { 
      p->x.g(); 
     } catch (SomeError & err) { 
     } 
    } 
} 

bu işlemi otomatik hale getirebilirsiniz araçlar var mı?

cevap

1

Gobject tabanlı C kitaplıkları için C++ sarmalayıcıları oluşturan gmmproc var, ancak C ve C++ arasında duyduğum tek kod üreteci bu.

Bir çözümleyici yazarken iyi iseniz, temel bir sarıcı oluşturucu oluşturmak çok zor olmaz. Sonunda elle birkaç rötuş eklemeniz gerekebilir, ancak yine de iş yükünüz azalır.

1

C kod üreticisi geçen yılki GSoC projesi olan SWIG'u deneyebilirsiniz. AFAIK, henüz bir daha gövdeye eklememişlerdi, bu yüzden & kanalını SVN'den kurmak zorunda kalacaksınız.

0

Bunu yapmak için hazır bir araç bilmiyorum. Eğer nesneyi otomatikleştirmek istiyorsanız ve kendi komut dosyalarınızı yazmaktan mutluluk duyarsanız, pygccxml (GCC-XML tabanlı), C++ başlıklarını ayrıştırmak için oldukça iyi bir yoldur.

1

C++ kodunuz ne kadar yazılmıştır, henüz ne kadar yazılmamıştır? Makul bir oran yazılacaksa, COM arabirimleri için IDL gibi, hem C++ hem de C üstbilgileri üreten basitleştirilmiş bir sözdizimi oluşturabilirim. Bu sadeleştirilmiş sözdizimi, C++ 'dan ayrıştırmanız için çok daha kolay olacaktır ya da muhtemelen bunu yapan raftan bir şey bulabilirsiniz.

2

Tam olarak bunu yapmak için Python'da bir C işlevi sarmalayıcısı geliştirdim (C işlevlerini sarmalayan C++ sınıfları oluşturur).

Hala genç ama yapmak için ihtiyacım olan şey şu anda burada. Bir deneyin ve ne düşündüğünüzü bana bildirin: https://github.com/mlb5000/CFunctionWrapperGenerator