LINUX.ORG.RU

interfacing c function with caml


0

0

Задача: вызвать из 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)"
★★★★★

Читать сырцы - там всё оченно понятно нарисовано.

Функция add, естественно, не так выглядеть должна.

Shapeshifter
()
Ответ на: комментарий от Shapeshifter

Покурив окамловские исходники пришёл к выводу, что 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

ugoday ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.