Browse thread
How to wrap around C++?
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2010-02-09 (00:26) |
From: | Michael Ekstrand <michael@e...> |
Subject: | Re: How to wrap around C++? |
On 02/08/2010 10:03 AM, Luca de Alfaro wrote: > Thank you very much! I follow the general lines, but... > > * Make sure no C++ exceptions leak to OCaml. > > This will be next to impossible: the C++ code I need to wrap is huge, > and I have no idea of what possible exceptions can be generated. I will > have to try to see if there is a generic exception catcher. There is. try { some code } catch (...) { caml_failwith("foo: exception thrown"); } with appropriate considerations for freeing memory, etc. > * Wrap your OCaml includes in 'extern "C" { ... }" > > > Here, I am not sure what you mean. You mean, > > extern "C" { > #include <caml/mlvalues.h> > ... > } > Exactly. > * Export all your stub functions with C linkage (extern "C") > > Ok, evidently, I need to learn this extern "C" construct. Yes, if you're interfacing between C and C++, you do need to know it. In this context, it is applied as a modifier to the function definition (like static). The big thing it does is turn off the name mangling used by the C++ compiler to implement overloading, type safety, etc. > * Compiling is tricky, since the OCaml compiler driver doesn't know what > to do with C++. The Swig documentation[1] has a workaround for this, > useful even if you don't use Swig. > > > Why would the Ocaml compiler driver need to know what to do with C++? > The C++ I need to link to is rather huge, and I will need to compile it > with its own build setup. > Once that is built, I need to compile the stubs, the Ocaml, and link the > three together (Ocaml, stubs, and C++), in native mode, but why would > the Ocaml compiler need to deal with C++? You will have 3 pieces: the C++ library, the OCaml interface, and the stubs gluing them together. Stubs must be C-compatible, so they can be called from OCaml. But they also need to be able to call into C++, hence they must be written in C++. Therefore, your stub code must be written in C++, exporting a C-compatible interface (via extern "C"). Generally, you use the OCaml compiler driver to compile stubs rather than gcc directly, but OCaml doesn't know how to call g++. - Michael