Задача: вызвать из ocaml кода цэшную функцию.
Для этого я создал 3 файла
% cat simple.mli
external add : int -> int = "add"
% cat simple.c
int add(int a){
return ++a;
}
%cat simple.ml
open Simple ;;
let a = add 4 ;;
Printf.printf "%d\n" a ;;
После чего выполнил
% ocamlc -c simple.mli
Получил simple.cmi
% ocamlc -c simple.c
Получил simple.o
% ocamlc -c simple.ml
Получил сообщение:
The implementation simple.ml does not match the interface simple.cmi:
The field `add' is required but not provided
Что делать?
В качестве документации использовал "The Objective Caml system release 3.07 (Documentation and user's manual)"
Покурив окамловские исходники пришёл к выводу, что simple.c должен выглядеть или так
#include "mlvalues.h"
CAMLexport value add(value a){
CAMLreturn (a);
}
или так
#include "mlvalues.h"
CAMLexport value add(value a){
return a;
}
В первом случае имеем
%ocamlc -c -I /usr/lib/ocaml/3.08/caml/ simple.c
simple.c: In function `add':
simple.c:4: warning: implicit declaration of function `CAMLreturn' // резонное замечание
simple.c:5: warning: control reaches end of non-void function
Во втором случае варнингов нет, но и там и так
%ocamlc -c simple.ml
The implementation simple.ml does not match the interface simple.cmi:
The field `add' is required but not provided