[Haskell-cafe] Wrapping a C++ library

Ian Ross ian at skybluetrades.net
Tue Jan 27 06:09:13 UTC 2015


Hi Arjun,

I've been doing quite a bit of this kind of thing recently, but it took me
a while to figure it out too.  I've made a little example at
https://github.com/ian-ross/cpp-ffi-example -- just clone the repo and
follow the instructions in the README.

The example has a C++ test library to build that doesn't do anything very
interesting but provides some things to bind to.  It uses a C wrapper
around the C++ library and C2HS to write the Haskell FFI side of things
(you can almost certainly use hsc2hs in the same kind of way).  There's
also a small test program so you see the bindings working end-to-end.  I
guess the most critical thing is using extern "C" and the __cplusplus
compiler macro to control the visibility of C++ code to GCC -- take a look
at cbits/a.h and cbits/a.cpp in the repo to see what I mean.

Feel free to ask if you have any questions.

Cheers,

Ian.


On 26 January 2015 at 23:55, Arjun Comar <nrujac at gmail.com> wrote:

> Alexey,
> 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.
>
> Thanks,
> Arjun
>
> On Mon, Jan 26, 2015 at 5:49 PM, Alexey Shmalko <rasen.dubi at gmail.com>
> wrote:
>
>> 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
>>>
>>>
>>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>


-- 
Ian Ross   Tel: +43(0)6804451378   ian at skybluetrades.net
www.skybluetrades.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20150127/092e451c/attachment.html>


More information about the Haskell-Cafe mailing list