Embarassing - I simply forgot to include Fib.o in the link. So it links now (program crashes, but I can try to sort that out).
I'm still intereted in knowing how to automatically get the list of required libraries. >>>>> "Colin" == Colin Paul Adams <[EMAIL PROTECTED]> writes: Colin> I am trying to call a Haskell function from an Eiffel Colin> program, using C as an intermediary. Colin> For starters, I compiled and ran a variation of the program Colin> shown in Colin> http://haskell.org/haskellwiki/Calling_Haskell_from_C, to Colin> make sure I had the C-code right. Colin> I then attempted to move it into Eiffel. I can compile the Colin> C code OK, but I'm running into problems with linking. Colin> I solved most of the problems by adding the -v flag to the Colin> call to ghc which I used to link the original (haskell + c Colin> only) program, and cut-and-paste the linker options from Colin> their into the Eiffel configuration file. This isn't really Colin> satisfactory - I would like some automatic way to determine Colin> what the flags should be. Colin> The remaining problem has me stumped. I am getting the Colin> following messages: Colin> big_file_C4_c.c:(.text+0x9f4f): undefined reference to Colin> `__stginit_Fib' /home/colin/fib/Fib_stub.o: In function Colin> `stginit_export_Fib_zdffibonaccizuhszuaQO': Colin> Fib_stub.c:(.text+0x5): undefined reference to Colin> `Fib_zdffibonaccizuhszuaQO_closure' Colin> /home/colin/fib/Fib_stub.o: In function `fibonacci_hs': Colin> Fib_stub.c:(.text+0x32): undefined reference to Colin> `Fib_zdffibonaccizuhszuaQO_closure' Colin> The Haskell code looks like this: >> {-# LANGUAGE ForeignFunctionInterface #-} >> >> module Fib where >> >> import Foreign.C.Types import CString >> >> fibonacci :: Int -> String fibonacci n = show (fibs !! n) where >> fibs = 0 : 1 : zipWith (+) fibs (tail fibs) >> >> fibonacci_hs :: CInt -> IO CString fibonacci_hs = newCString >> . fibonacci . fromIntegral >> >> foreign export ccall fibonacci_hs :: CInt -> IO CString Colin> And the C code (in an Eiffel wrapper) looks like this: Colin> haskell_fib (n: INTEGER): POINTER is -- String Colin> representation of `n'th Fibonacci number as a string Colin> external "C inline use <stdio.h>,%"HsFFI.h%"" alias "[ Colin> #ifdef __GLASGOW_HASKELL__ #include "Fib_stub.h" extern Colin> void __stginit_Fib ( void ); #endif Colin> int argc; char *argv[0]; argc = 0; Colin> hs_init(&argc, &argv); #ifdef __GLASGOW_HASKELL__ Colin> hs_add_root(__stginit_Fib); #endif return Colin> (fibonacci_hs($n)); hs_exit(); ]" end Colin> I can't find any mention of the word "fibonacci" in the Colin> output from the ghc run, and I don't know where this Colin> _closure stuff is coming from. Can you help? -- Colin Colin> Adams Preston Lancashire Colin> _______________________________________________ Colin> Glasgow-haskell-users mailing list Colin> Glasgow-haskell-users@haskell.org Colin> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users -- Colin Adams Preston Lancashire _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users