У меня проблемы с определением сигнатуры функции C void, которая принимает uint64_t
и char*
. Я пробовал int64 -> string -> _
.
Я также не знаю, как скомпилировать мой файл C ++ (с интерфейсом C) вместе
events.ml
open Lwt.Infix
external call: int64 -> string -> _ = "function_pointer_caller"
let begin_event pointer =
Lwt_unix.sleep 5.0 >>= fun () ->
call pointer "message"
let () = Callback.register "begin_event" begin_event
интерфейс. c:
#include <stdio.h>
#include <string.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
#include <caml/alloc.h>
#include <caml/bigarray.h>
extern void register_function_callback();
void print_from_event(char* message) {
printf("OCaml event: %s\n", message);
}
void function_pointer_caller(uint64_t pointer, char* message)
{
void (*f)(char *);
f = pointer;
}
void register_function_callback() {
static const value *begin_event_closure = NULL;
if (begin_event_closure == NULL)
{
begin_event_closure = caml_named_value("begin_event");
if (begin_event_closure == NULL)
{
printf("couldn't find OCaml function\n");
exit(1);
}
}
uint64_t pointer = (uint64_t) &function_pointer_caller;
caml_callback(*begin_event_closure, (int64_t) &pointer);
}
основной. cc
#include <stdio.h>
#include <caml/callback.h>
extern "C" void register_function_callback();
int main(int argc, char **argv)
{
caml_startup(argv);
register_function_callback();
while (true)
{
}
return 0;
}
Думаю, есть нет возможности скомпилировать. cc вместе с .ml, потому что. cc не обязательно имеет интерфейс C. Может быть, можно скомпилировать .ml в объект .so и связать его с. cc с интерфейсом C?
В любом случае, я изменил interface.cc
на interface.c
и добавил interface.c
к команде ocamlopt
:
ocamlfind ocamlopt -o s -linkpkg -package lwt.unix -thread event_emitter.ml interface.c
g++ -o event_emitter_program -I $(ocamlopt -where) \
s.o interface.o main.cc event_emitter.o $(ocamlopt -where)/libasmrun.a -ldl
Первая команда компилируется нормально, но g ++ дает
event_emitter.o: In function `camlEvent_emitter__begin_event_90':
:(.text+0x3f): undefined reference to `camlLwt_unix__sleep_695'
:(.text+0x4c): undefined reference to `camlLwt__bind_1276'
collect2: error: ld returned 1 exit status
Обратите внимание, что я подключаю interface.o
из предыдущей команды (ocamlopt
) и ссылку в g ++, потому что ocamlopt
фактически передает C файлы компилятору C.
Я не знаю, почему он жалуется на Lwt_unix
вещи, поскольку я уже скомпилировал с их в ocamlopt
.