2009-07-01 11 views
19

Voglio generare wrapper C da librerie C++. Ci sono tutorial su come farlo a mano:Genera wrapper C da C++?

Ma è troppo di un lavoro manuale.

Ad esempio, per questo:

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

ho bisogno di scrivere:

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

ci sono strumenti in grado di automatizzare questo processo?

risposta

1

C'è gmmproc che crea wrapper C++ per librerie C basate su gobject, ma questo è l'unico generatore di codice che ho sentito tra C e C++.

Se si sta bene con la scrittura di un parser, non sarebbe un compito troppo difficile creare un generatore di wrapper di base. Alla fine potrebbe essere necessario aggiungere alcuni tocchi finali manualmente, ma il carico di lavoro sarà ridotto.

1

Si può provare SWIG, generatore di codice C è stato il progetto GSoC dello scorso anno. AFAIK non l'hanno ancora unito al bagagliaio, quindi dovresti fare il checkout & per costruire il ramo da SVN.

0

Non conosco uno strumento standard per farlo. Se vuoi automatizzare la generazione e sei felice di scrivere i tuoi script, pygccxml (basato su GCC-XML) è un bel modo per analizzare le intestazioni di C++.

1

Quanto del codice C++ è già stato scritto rispetto a quanto deve ancora essere scritto? Se una ragionevole parte è stata scritta, creerei una sintassi semplificata, che genera sia le intestazioni C++ che C, come fa IDL per le interfacce COM. Questa sintassi semplificata sarà molto più semplice da analizzare rispetto a C++, oppure è probabile che tu possa trovare qualcosa che funzioni.

2

Ho appena sviluppato un wrapper funzione C in Python per fare esattamente questo (generare classi C++ che avvolgono le funzioni C).

È ancora giovane ma la maggior parte di ciò che avevo bisogno di fare era lì ora. Fai un tentativo e fammi sapere cosa ne pensi: https://github.com/mlb5000/CFunctionWrapperGenerator