从 C 调用 OCaml

主要内容总结:

  • 基础部分(Basics):假设一个最小目录结构,通过添加新的绑定文件夹bindings来暴露库中的方法给 C。dune文件配置指定了可执行文件capi,包含相关库和外部存根等信息。capi.ml利用Callback库注册要暴露给 C 的函数,并为函数关联唯一字符串。cstubs.c实现 C 端调用注册的 OCaml 函数,需确保初始化 OCaml 运行时,通过caml_callback_exn调用 OCaml 函数。nm -D capi.so可检查函数是否为导出符号。
  • 垃圾回收部分(Garbage Collection):在最小示例中忽略了与垃圾回收的交互,对于暴露的Ocaml_library.func2(类型为string -> string),介绍了分配和提取字符串的方法,如caml_copy_stringcaml_string_length等。给出了垃圾回收安全的模式,使用CAMLparam0()等宏来确保值在函数局部范围内存活,通过caml_register_generational_global_root等函数注册和移除 GC 根。
  • 选项部分(Option):OCaml 的option类型在 C 中很容易操作,无需额外注册is_noneget_int_from_some函数。通过optional_integer_t结构体来处理int option类型,利用Is_noneSome_valInt_val等宏进行判断和取值。

关键信息和重要细节:

  • 目录结构及各文件作用:project/下的不同文件夹和文件,bindings/中的capi.mlcstubs.cdune文件。
  • dune文件配置细节:如指定可执行文件名称、包含的库、外部存根等。
  • OCaml 与 C 交互的关键函数和宏:Callback.registercaml_callback_exncaml_copy_string等。
  • 垃圾回收相关的函数和宏:CAMLparam0()caml_register_generational_global_root等及其使用场景。
  • option类型在 C 中的处理方式及相关宏的使用。
阅读 9
0 条评论