Cxx foreign function interface
This page outlines the challenges involved in building a foreign function interface (FFI) from Haskell to C++ libraries, references some general background about the FFI, and then describes some solutions to the difficulties of C++.
Difficulties of Interfacing to C++
Foreign function interfaces (FFIs) from Haskell to C are well developed, but writing an FFI to a C++ library remains a difficult undertaking. In general, the Haskell FFI apparatus specifies how to call a function (not a method) using the "ccall" calling mechanism used for C programs. The FFI specification Definition#Addenda_to_the_report mentions, but does not require, an alternative calling mechanism for C++; no Haskell compiler has ever implemented this. Extra complications arise in interfacing to C++ libraries:
- A C++ program allows overloading, using the same function name with different argument lists. But at the binary level, each different version of the function must have its own name. The C++ compiler "mangles" the function names to differentiate them.
- A C++ program may have classes with constructors, destructors, and methods. These are, obviously, not quite the same as functions, and have no obvious counterpart in Haskell.
- Inheritance (maybe)
- Template functions, template classes, etc.
Understanding the FFI in general, and with respect to the C programming language in particular, is vital background for anyone wishing to build a Haskell interface to C++. The following pages provide background information:
Building Interfaces to C++
- IO_inside describes how to interface to a C++ library using the "export C" declaration (in C++) which makes it look like a C library. This seems to be the standard technique for briding the gap between Haskell and C++.
- CPlusPlus_from_Haskell describes "the hard way" of interfacing to C++, using the mangled C++ names directly without using "export C". It also suggests the possibility of a more automated approach using gcc-xml.
- Hacanon automatically generates an FFI to C++ using [Template_Haskell],, but its author has placed it "on hold" and sees some inherent flaws in using Template Haskell. (See David Himmelstrup, 2006, "About Lemmih", accessed 20 June 2009)
- The HQK project reports having developed a small Haskell module, qoo, for accessing object-oriented libraries conveniently.