Mam plik nagłówkowy, który deklaruje C API dla pewnej biblioteki i chciałbym utworzyć wiązania OCaml dla tej biblioteki. Zauważyłem, że camlidl może tworzyć kody pośredniczące z pliku IDL, ale jak rozumiem, nie ma automatycznej konwersji z pliku *.h
na IDL, więc teraz zastanawiam się, czy istnieje inny sposób generowania kodu pośredniczącego dla wiązań OCaml z pliku nagłówkowego C?Generowanie wiązań programu Ocaml z pliku nagłówkowego C
Odpowiedz
W pliku nagłówkowym C jest za mało informacji, aby zapisać powiązania dla innego języka. W bardzo prostych przypadkach (na przykład, wszystkie funkcje przyjmują tylko liczby całkowite lub zmiennoprzecinkowe), jest to możliwe, ale gdy tylko zaangażują się wskaźniki, musisz podać więcej informacji: czy funkcja będzie odczytywana ze wskazanej wartości, napisz do tego, czy do obu? Czy interfejs musi zezwalać na zerowy wskaźnik? Czy w rzeczywistości jest to wskaźnik do tablicy i gdzie jest rozmiar? Czy to char*
jest wskaźnikiem do zakończonego znakiem zero łańcucha?
IDL rozszerza deklaracje funkcji C o dodatkowe adnotacje, aby objąć wszystkie te punkty. Dlatego camlidl
działa na IDL, a nie bezpośrednio na nagłówkach C. Nie znajdziesz niczego znacznie mniej bolesnego.
Istnieje jeszcze inne podejście, które polega na swobodnym przypisywaniu nagłówków C makrom, które mają puste rozwinięcie, ale dostarczają dodatkowych informacji o typie, np.
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);
Takie adnotacje nie są wystandaryzowane, więc jeśli wybierzesz tę trasę, musisz napisać własne narzędzia. (Jeśli chcesz przetworzyć kod C, spójrz na Cil). Zamiast tego polecam traktować deklaracje IDL jako podstawowe i generować z nich pliki nagłówkowe C.
Czy pomocna byłaby Swig?