12

我想在 OCaml 和 C++ 之间架起一座桥梁。例如,我想在 C++ 中使用一些用 OCaml 编写的结构。

我怎样才能做到这一点?是否有任何库,绑定?

4

2 回答 2

17

您应该阅读语言手册的相关部分:Interfacing C with OCaml。即使从本质上讲,它是非常详细的,也是非常低级的。

如果您不需要C++ 和 OCaml 代码之间的紧密通信(例如,您接口 GUI 代码和计算代码,但应用程序的计算密集型内核不会跨越应用程序边界,或者至少预计通信成本可以忽略不计与花费在任何一方的时间相比),我建议您探索更简单的方法,其中 C++ 和 OCaml 代码在单独的进程中运行,并通过消息传递交换信息(以最方便定义的任何格式:文本、s 表达式、二进制格式、JSON 等)。如果我确定更简单的方法不起作用,我只会尝试在同一过程中桥接代码。

编辑:自从我去年写了这个答案以来,Ctypes库出现了,来自 Jeremy Yallop;这是一种非常有前途的方法,可能比直接将 C 与 OCaml 接口简单得多。

于 2013-03-03T14:34:31.353 回答
5

最简单的方法是分两个步骤:OCaml → C,然后使用extern关键字 C → C++。我在我的COH*ML项目中广泛执行此操作,该项目将 OCaml 与 C++ 中的Coherence库绑定。例如在 OCaml 我有:

type coh_ptr  (* Pointer to a Cohml C++ object *)
external coh_getcache: string -> coh_ptr = "caml_coh_getcache"

然后在 C++ 中,首先是一个 C 函数:

extern "C" {
  value caml_coh_getcache(value cn) {
    CAMLparam1(cn);
    char* cache_name = String_val(cn);
    Cohml* c;
    try {
      c = new Cohml(cache_name);
    } catch (Exception::View ce) {
      raise_caml_exception(ce);
    }
    value v = caml_alloc_custom(&coh_custom_ops, sizeof(Cohml*), 0, 1);
    Cohml_val(v) = c;
    CAMLreturn(v);
  }
}

最后是 C++ 实现:

Cohml::Cohml(char* cn) {
  String::View vsCacheName = cn;
  hCache = CacheFactory::getCache(vsCacheName);
}

反其道而行之,原理基本相同。

于 2013-05-01T14:43:37.893 回答