type t (* void *)

関数型言語や英語学習の事とか。

ocamlのctypesで.oをリンクする

昔はもっと面倒だったと思うのですが、いつの間にか動くようになっていました。OCaml 4.07, ctypes 0.11.5で確認。
ocamloptでは普通に.oをリンクするだけでctypesで作った関数が呼び出せる。
ocamlcではできない。

open Ctypes
open Foreign

let f = foreign "f" (void @-> returning int)

let _ =
  Format.printf "%d@." @@ f ()
int f ()
{
  return 100;
}
OCAMLC=ocamlfind ocamlc -package ctypes,ctypes.foreign
OCAMLOPT=ocamlfind ocamlopt -package ctypes,ctypes.foreign

test.x: lib.o main.cmx
        ${OCAMLOPT} -o $@ -linkpkg $^

test: lib.o main.cmo
        ${OCAMLC} -o $@ -linkpkg $^

clean:
        rm *.o *.cm? *.so

# 使ってない
lib.so: lib.o
        gcc -shared $^ -o $@

%.o: %.c
        gcc -c $<

%.cmo: %.ml
        ${OCAMLC} -c $<

%.cmx: %.ml
        ${OCAMLOPT} -c $<