主要内容总结:
- 基础部分(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_string和caml_string_length等。给出了垃圾回收安全的模式,使用CAMLparam0()等宏来确保值在函数局部范围内存活,通过caml_register_generational_global_root等函数注册和移除 GC 根。 - 选项部分(Option):OCaml 的
option类型在 C 中很容易操作,无需额外注册is_none和get_int_from_some函数。通过optional_integer_t结构体来处理int option类型,利用Is_none、Some_val和Int_val等宏进行判断和取值。
关键信息和重要细节:
- 目录结构及各文件作用:
project/下的不同文件夹和文件,bindings/中的capi.ml、cstubs.c和dune文件。 dune文件配置细节:如指定可执行文件名称、包含的库、外部存根等。- OCaml 与 C 交互的关键函数和宏:
Callback.register、caml_callback_exn、caml_copy_string等。 - 垃圾回收相关的函数和宏:
CAMLparam0()、caml_register_generational_global_root等及其使用场景。 option类型在 C 中的处理方式及相关宏的使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。