[Haskell-cafe] Wrapping a C++ library

Arjun Comar nrujac at gmail.com
Mon Jan 26 22:55:02 UTC 2015

It's unfortunately been about a year since I've worked on the project that
needed FFI support so I don't recall the precise issue any longer. From
talking to people in #haskell, I discovered that it would be necessary to
call g++ and not gcc because gcc is unable to locate some headers and
libraries that inevitably get included by C++ projects.


On Mon, Jan 26, 2015 at 5:49 PM, Alexey Shmalko <rasen.dubi at gmail.com>

> Arjun,
> I'm not an expert in writing Haskell binding but pretty much experienced
> in C/low-level stuff.
> You shouldn't force compilation of .c files with g++. Instead, you should
> keep your wrapping functions as extern "C" and place their implementation
> in .cpp file (which of course should be compiled with g++). Don't forget to
> link to C++ runtime library (-lstdc++).
> There is also a wiki page[1] that describes how to call C++ from Haskell.
> Best regards,
> Alexey
> [1]: https://wiki.haskell.org/CPlusPlusFromHaskell
> 2015-01-26 23:27 GMT+02:00 Arjun Comar <nrujac at gmail.com>:
>> Richard,
>> If you create a straight C header that's able to call into the C++
>> library then what you're trying to do will work. This is the standard
>> (though frustrating) approach to using C++ libraries within Haskell. I can
>> send you an example cabal file for building the Haskell code against the C
>> headers and archives if you'd like. There isn't much more to it than what
>> you're already doing though. The key is that the headers have to be pure C
>> and you have to force cabal to build the C code with g++ (since the
>> implementing .c files will necessarily make C++ calls).
>> Thanks,
>> Arjun
>> On Mon, Jan 26, 2015 at 11:29 AM, Donn Cave <donn at avvanta.com> wrote:
>>> Quoth Richard Lewis <richard.lewis at gold.ac.uk>,
>>> ...
>>> > There's a specific question here which goes something like: how do I
>>> > get hsc2hs to compile code that uses STL headers?
>>> For me, that would be the first thing to fix.  Use #ifdef __cplusplus,
>>> or just reorganize, so the hsc2hs-generated files are just C.
>>> You wrote your wrapper library for the C++ part, and if the callers
>>> need to be C++ it kind of defeats the purpose.
>>> From there, I would have guessed "extra-libraries: stdc++" would do it,
>>> (assuming you have also arranged to get your wrapper library in there),
>>> but I'm no cabal expert.  I use C++ more or less like you're doing, so
>>> there's hope, but I haven't gotten around to the cabal part of the
>>> exercise.
>>>         Donn
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20150126/a26dda52/attachment.html>

More information about the Haskell-Cafe mailing list