Mai*_*r00 11 c++ interop ocaml
我想在OCaml和C++之间建立一个桥梁.例如,我想在C++中使用一些用OCaml编写的结构.
我怎样才能做到这一点?有没有任何库,绑定?
gas*_*che 16
您应该阅读语言手册的相关部分:将C与OCaml连接.即使本质上是痛苦的低级别,它也是非常详细的.
如果您不需要C++和OCaml代码之间的紧密通信(例如,您接口GUI代码和计算代码,但您的应用程序的计算密集型内核不会跨越应用程序边界,或者至少预计通信成本可以忽略不计与在任何一方花费的时间相比,我建议你探索更简单的方法,其中C++和OCaml代码在不同的进程中运行,并通过消息传递交换信息(以最方便定义的任何格式:text,s-expressions ,二进制格式,JSON等).如果我确信更简单的方法不起作用,我只会尝试在同一个进程中桥接代码.
编辑:自从我去年写下这个答案后,出现了来自Jeremy Yallop 的Ctypes图书馆; 这是一种非常有前景的方法,可能比直接将C与OCaml接口简单得多.
最简单的方法是分两步: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"
Run Code Online (Sandbox Code Playgroud)
然后在 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);
}
}
Run Code Online (Sandbox Code Playgroud)
最后是 C++ 实现:
Cohml::Cohml(char* cn) {
String::View vsCacheName = cn;
hCache = CacheFactory::getCache(vsCacheName);
}
Run Code Online (Sandbox Code Playgroud)
走另一条路基本上是相同的原理。