主要内容总结:
- 基础部分(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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。