Ho un file di intestazione che dichiara un'API C per qualche libreria e vorrei creare un binding OCaml per questa libreria. Ho scoperto che Camlidl può creare stub da un file IDL ma, come ho capito, non esiste alcuna conversione automatica da un file *.h
a IDL, quindi ora mi chiedo se c'è un altro modo per generare stub per i binding OCaml da un file di intestazione C?Genera gli stub dei binding di Ocaml dal file di intestazione C
risposta
Non ci sono abbastanza informazioni in un file di intestazione C per scrivere associazioni per un'altra lingua. In casi molto semplici (ad esempio, tutte le funzioni accettano solo argomenti interi o in virgola mobile), è possibile, ma non appena vengono coinvolti i puntatori, è necessario fornire ulteriori informazioni: la funzione legge dal valore puntato, scrive ad esso, o entrambi? L'interfaccia deve consentire un puntatore nullo? Questo è in realtà un puntatore a un array, e dov'è la dimensione? Questo è char*
un puntatore a una stringa a terminazione zero?
IDL espande le dichiarazioni di funzione C con annotazioni aggiuntive per coprire tutti questi punti. Ecco perché camlidl
funziona su IDL e non direttamente sulle intestazioni C. Non troverai nulla di significativamente meno doloroso.
C'è un altro approccio, che è quello di annotare liberamente le intestazioni C con macro che hanno un'espansione vuota ma forniscono informazioni di tipo extra, ad es.
int memmove(void ANN_OUT ANN_SIZE(n) ANN_NOT_NULL *dest,
const void ANN_IN ANN_SIZE(n) ANN_NOT_NULL *src,
size_t n);
Tali annotazioni non sono standardizzate, quindi se segui questo percorso dovrai scrivere i tuoi strumenti. (Cercare Cil se si desidera analizzare C.) Si consiglia invece di considerare le dichiarazioni IDL come primarie e di generare da esse i file di intestazione C.
Swig Sarebbe utile?
- 1. protoc non genera file stub di servizio
- 2. Domanda di base sull'inclusione dei file di intestazione C++?
- 3. Dipendenze dei file di intestazione tra i moduli C++
- 4. Quali sono i punti dei file di intestazione in C?
- 5. L'alias dei nomi dei nomi C++ dovrebbe essere usato nei file di intestazione?
- 6. Vim C++ genera un file sorgente basato sul file di intestazione
- 7. Binding DataGrid colonna di intestazione di DataContext
- 8. Come creare file di intestazione C
- 9. Maiuscole/minuscole nei file di intestazione C++
- 10. CocoaPods genera file di progetto valido (intestazione non trovato)
- 11. C++ Ordine di intestazione
- 12. File di intestazione C e compilazione/collegamento
- 13. qual è la differenza tra i file di intestazione c (.h) e i file di intestazione C++ (.hpp)
- 14. convertire il file di intestazione C++ nel file protobuf .proto
- 15. Genera file di intestazione (* .h) per file di libreria condivisa (* .so)
- 16. Emacs C++, aprendo corrispondente file di intestazione
- 17. file di intestazione dell'interfaccia C++/cli
- 18. Richiesta di stub Webmock con qualsiasi corpo e intestazione
- 19. YouCompleteMe, file di intestazione
- 20. Comprensione dei funtori in OCaml
- 21. Genera automaticamente file C++ di origine e intestazione (e aggiorna viceversa sulle modifiche)
- 22. Come personalizzare gli stub javadoc generati?
- 23. incluso un file di intestazione due volte in C++
- 24. Come fa un compilatore C/C++ a trovare le definizioni dei prototipi nei file di intestazione?
- 25. Modifica file di intestazione IDL generato
- 26. Crea automaticamente unità di interfaccia Delphi/Freepascal dal file di intestazione C
- 27. Quali sono gli usi positivi dei moduli in pacchetto OCaml?
- 28. Xcode 7 non trova i file di intestazione dal framework
- 29. Python - Rimuovi intestazione e piè di pagina dal file docx
- 30. C: Qual è l'uso di "extern" nei file di intestazione?