[Haskell-cafe] exporting Data.ByteString functions via FFI

kenny lu haskellmail at gmail.com
Fri Jun 12 04:04:13 EDT 2009


It works indeed. Thanks.

-Kenny

On Fri, Jun 12, 2009 at 3:50 PM, Jochem Berndsen <jochem at functor.nl> wrote:

> kenny lu wrote:
> > Hi,
> >
> > I was trying to write a FFI wrapper for my Haskell program which
> manipulates
> >
> > ByteString. But I am unable to compile/link it.
> >
> >
> > Here is the toy program.
> >
> > {-# LANGUAGE ForeignFunctionInterface #-}
> >
> > module B where
> >
> > import Foreign.C.Types
> > import Foreign.C.String
> > import qualified Data.ByteString as BS
> >
> > rev :: BS.ByteString -> BS.ByteString
> > rev bstr = BS.reverse bstr
> >
> > rev_hs :: CString -> IO CString
> > rev_hs cstr =
> >     do { bstr <- BS.packCString cstr
> >        ; let bstr' = rev bstr
> >        ; cstr' <- newCString (show bstr')
> >        ; return cstr'
> >        }
> >
> > foreign export ccall rev_hs :: CString -> IO CString
> >
> >
> > And here is the C counter-part.
> >
> > #include "B_stub.h"
> > #include <stdio.h>
> >
> > int main(int argc, char *argv[]) {
> >   char *str;
> >   hs_init(&argc, &argv);
> >
> >   str = rev_hs("it works.");
> >   printf("Rev: %s\n", str);
> >
> >   hs_exit();
> >   return 0;
> > }
> >
> > Compiling B.hs alone seems fine, but errors popped up when I was trying
> to
> > compile/link it with C.
> >
> > $ ghc -c -O B.hs
> >
> > $ ghc -optc-O test_b.c B.o B_stub.o -o test_b
> > Undefined symbols:
> >   "___stginit_bytestringzm0zi9zi1zi4_DataziByteString_", referenced from:
> >       ___stginit_Lib_ in B.o
> >   "_bytestringzm0zi9zi1zi4_DataziByteString_zdwreverse_info", referenced
> > from:
> >       _s19w_info in B.o
> >   "_bytestringzm0zi9zi1zi4_DataziByteStringziInternal_zdwshowsPrec_info",
> > referenced from:
> >       _s19v_info in B.o
> >
> "_bytestringzm0zi9zi1zi4_DataziByteStringziInternal_zdwshowsPrec_closure",
> > referenced from:
> >       _Lib_zdwa_srt in B.o
> >   "_bytestringzm0zi9zi1zi4_DataziByteString_zdwa4_info", referenced from:
> >       _Lib_zdwa_info in B.o
> >   "_bytestringzm0zi9zi1zi4_DataziByteString_reverse_info", referenced
> from:
> >       _Lib_rev_info in B.o
> > ld: symbol(s) not found
> > collect2: ld returned 1 exit status
> >
> >
> > If I replace ByteString with the ordinary String, the above programs can
> be
> > compiled and linked.
> >
> > Can someone tell me what I did wrong here?
>
> Add -package bytestring to the ghc command line options. I believe that
> adding --make also may work.
>
> Regards,
> --
> Jochem Berndsen | jochem at functor.nl
> GPG: 0xE6FABFAB
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090612/c9fb3b8e/attachment.html


More information about the Haskell-Cafe mailing list