2009-07-01 17 views
19

Quiero generar C wrappers de librerías C++. Hay tutoriales sobre cómo hacerlo a mano:¿Generar contenedor C desde C++?

pero es demasiado de un trabajo manual.

Por ejemplo, para esto:

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

necesito escribir:

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) { 
     } 
    } 
} 

¿Hay herramientas que pueden automatizar este proceso?

Respuesta

1

Hay gmmproc que crea contenedores C++ para bibliotecas C basadas en gobject, pero ese es el único generador de código del que he oído hablar entre C y C++.

Si es bueno escribiendo un analizador, no sería una tarea demasiado difícil crear un generador de envoltura básico. Al final, es posible que deba agregar algunos toques finales manualmente, pero aún así su carga de trabajo se verá reducida.

1

Puede probar SWIG, el generador de códigos C fue el proyecto GSoC del año pasado. AFAIK aún no lo han fusionado en el baúl, por lo que tendrías que pagar & para construir la sucursal desde SVN.

0

No conozco una herramienta lista para usar para hacer esto. Si desea automatizar la generación y está feliz de escribir sus propios scripts, pygccxml (basado en GCC-XML) es una forma bastante agradable de analizar los encabezados de C++.

1

¿Cuánto de su código C++ ya está escrito frente a cuánto queda por escribir? Si se va a escribir una proporción razonable, crearía una sintaxis simplificada, que genera los encabezados C++ y C, como lo hace IDL para las interfaces COM. Esta sintaxis simplificada será mucho más fácil de analizar que C++, o es probable que encuentre algo fuera de lugar que lo haga.

2

Acabo de desarrollar un contenedor de funciones C en Python para hacer exactamente esto (generar clases de C++ que envuelvan las funciones de C).

Todavía es joven, pero la mayor parte de lo que necesitaba hacer ahora es ahí. Pruébalo y cuéntame lo que piensas: https://github.com/mlb5000/CFunctionWrapperGenerator