ocaml ctypes
ocaml-ctypes 0.21.1
ctypes는 순수 OCaml을 사용하여 C 라이브러리에 바인딩하기 위한 라이브러리입니다. 주요 목표는 C 확장을 최대한 간단하게 작성하는 것입니다.
ctypes의 핵심은 C 유형(숫자 유형, 배열, 포인터, 구조체, 공용체 및 함수)의 구조를 설명하기 위한 연결자 세트입니다. 이러한 연결자를 사용하여 호출하려는 함수 유형을 설명한 다음 해당 함수에 직접 바인딩할 수 있습니다. 이 모든 작업은 C를 작성하거나 생성하지 않고도 가능합니다!
다음 C 함수에 바인딩한다고 가정해 보겠습니다.
int sigemptyset ( sigset_t * set );
int sigfillset ( sigset_t * set );
int sigaddset ( sigset_t * set , int signum );
int sigdelset ( sigset_t * set , int signum );
int sigismember ( const sigset_t * set , int signum );
ctypes를 사용하면 이러한 함수에 대한 인터페이스를 다음과 같이 설명할 수 있습니다.
let sigemptyset = foreign " sigemptyset " (ptr sigset_t @-> returning int )
let sigfillset = foreign " sigfillset " (ptr sigset_t @-> returning int )
let sigaddset = foreign " sigaddset " (ptr sigset_t @-> int @-> returning int )
let sigdelset = foreign " sigdelset " (ptr sigset_t @-> int @-> returning int )
let sigismember = foreign " sigismember " (ptr sigset_t @-> int @-> returning int )
이 코드로 바인딩된 이름은 예상할 수 있는 유형을 갖습니다.
val sigemptyset : sigset_t ptr -> int
val sigfillset : sigset_t ptr -> int
val sigaddset : sigset_t ptr -> int -> int
val sigdelset : sigset_t ptr -> int -> int
val sigismember : sigset_t ptr -> int -> int
그게 전부입니다. C 확장을 작성하는 일반적인 방법과 달리 작성할 C "스텁" 함수가 없으므로 오류가 발생할 가능성이 훨씬 적습니다.
문서 및 소스 배포판에는 구조체, 공용체, 배열, 콜백 함수 등과 관련된 더 복잡한 예가 포함되어 있으며 OCaml에서 C 값(예: sigset_t ptr
인스턴스)을 만들고 사용하는 방법을 보여줍니다.
Cstubs_structs
모듈을 사용하여 데이터 레이아웃을 안정적으로 결정하는 방법을 보여줍니다.