[Haskell-cafe] Building shared library to be called from C

Jack Hill jackhill at jackhill.us
Thu Apr 7 16:52:39 UTC 2016


Hi,

I'm attempting to build a shared library that can be called from C. My end 
goal is to build a PAM module, but for now I'm working with toy programs 
so that I can get a feel for building how to build the library.

The Haskell part looks like this (in a file called hfact.hs)

   module Hfact where

   import Foreign
   import Foreign.C.Types

   foreign export ccall fact_hs :: CInt -> CInt

   fact :: Int -> Int
   fact x = product [1..x]

   fact_hs :: CInt -> CInt
   fact_hs = fromIntegral . fact . fromIntegral

I can compile this into a so (I think successfully) with "ghc --make -shared -dynamic -fPIC -o libhfact.so hfact.hs".

Now I would like to be able to call this from C. I have a C program (in a file called main.c) as follows:

   #include <stdio.h>
   #include "HsFFI.h"
   #include "hfact_stub.h"

   int main(int argc, char *argv[]) {
     int user, answer;

     scanf("%d", &user);
     hs_init(&argc, &argv);
     answer = fact_hs(user);
     hs_exit();
     printf("Result: %d\n", answer);

     return 0;
   }

Unfortunately, I'm at a loss for how to build and link this against my so.

If I try "gcc main.c -lhfact", I get many undefined symbol errors like:

/nfshomes/j/jackhill/.stack/programs/x86_64-linux/ghc-7.10.3/lib/ghc-7.10.3/base_HQfYBxpPvuw8OunzQu6JGM/libHSbase-4.8.2.0-HQfYBxpPvuw8OunzQu6JGM-ghc7.10.3.so: undefined reference to `__hscore_get_saved_termios'

If I try "ghc maint.c -lhfact" I get:

/tmp/ghc19146_0/ghc_4.o: In function `main':
ghc_3.c:(.text+0x0): multiple definition of `main'
maint.o:maint.c:(.text+0x0): first defined here
/tmp/ghc19146_0/ghc_4.o: In function `main':
ghc_3.c:(.text+0x61): undefined reference to `ZCMain_main_closure'
collect2: error: ld returned 1 exit status

How should I be calling Haskell from C?

Best,
Jack


More information about the Haskell-Cafe mailing list