我想在OCaml和C ++之间建立一个桥梁。例如,我想在C ++中使用一些用OCaml编写的结构。
我怎样才能做到这一点?是否有任何库,绑定?
答案 0 :(得分:16)
您应该阅读语言手册的相关部分:Interfacing C with OCaml。即使本质上是痛苦的低级别,它也是非常详细的。
如果您不需要C ++和OCaml代码之间的紧密通信(例如,您接口GUI代码和计算代码,但应用程序的计算密集型内核不会跨越应用程序边界,或者至少与双方花费的时间相比,预计通信成本是可以忽略的),我建议你探索更简单的方法,其中C ++和OCaml代码在不同的进程中运行,并通过消息传递交换信息(无论采用何种格式最方便的定义:文本,s表达式,二进制格式,JSON等)。我只会尝试在相同的进程中桥接代码,如果我确定更简单的方法无法工作。
编辑:自从我去年写下这个答案后,杰里米·雅洛普出现了Ctypes图书馆;这是一种非常有前途的方法,可能比直接将C与OCaml接口简单得多。
答案 1 :(得分:4)
最简单的方法是分两步: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);
}
走另一条路的原则基本相同。