Linking to Haskell code from an external program
Colin Paul Adams
colin at colina.demon.co.uk
Sun Nov 23 10:20:20 EST 2008
>>>>> "Colin" == Colin Paul Adams <colin at colina.demon.co.uk> writes:
>>>>> "Simon" == Simon Marlow <marlowsd at gmail.com> writes:
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.
Simon> The only other way I can think of is to construct the
Simon> arguments yourself by querying the package database,
Simon> e.g. "ghc-pkg field ld-options rts", but you'll have to
Simon> combine the information from several different fields of
Simon> the packages you use, and basically reproduce what GHC does
Simon> to construct the ld command line.
I have upgraded to ghc 6.10.1 by compiling from source.
Now I can't get it to link, either using my previous method of linking
a standalone C program via ghc -v, and copying the -u options, or by
running:
ghc-pkg field rts ld-options
(I found out by trial-and error that the syntax you gave above was
inverted).
In both cases, I get errors:
/home/colin/fib/Fib.o: In function `r131_info':
(.text+0x79): undefined reference to `base_GHCziBase_ZC_con_info'
/home/colin/fib/Fib.o: In function `r131_info':
(.text+0x10f): undefined reference to `base_GHCziBase_ZMZN_closure'
/home/colin/fib/Fib.o: In function `s13p_info':
(.text+0x157): undefined reference to `base_GHCziBase_ZMZN_closure'
/home/colin/fib/Fib.o: In function `s13F_info':
(.text+0x2cf): undefined reference to `base_GHCziBase_ZMZN_closure'
/home/colin/fib/Fib.o: In function `s13c_info':
(.text+0x32): undefined reference to `base_GHCziNum_plusInteger_info'
/home/colin/fib/Fib.o: In function `r131_info':
(.text+0x124): undefined reference to `base_GHCziList_foldr21_info'
/home/colin/fib/Fib.o:(.data+0x0): undefined reference to `base_GHCziNum_Szh_static_info'
/home/colin/fib/Fib.o:(.data+0x10): undefined reference to `base_GHCziNum_Szh_static_info'
/home/colin/fib/Fib.o: In function `r131_closure':
(.data+0x38): undefined reference to `base_GHCziBase_ZC_static_info'
/home/colin/fib/Fib.o: In function `r131_closure':
(.data+0x58): undefined reference to `base_GHCziBase_ZC_static_info'
collect2: ld returned 1 exit status
I tried in desperation to add -u flag for each of the undefined
symbols above, but it makes no difference.
I'm quite lost now.
My C code looks like this:
static char * program_name = "Eiffel program";
static char * terminator = (char *) 0;
int argc;
char **argv[2];
argc = 1;
argv [0] = &program_name;
argv [1] = &terminator;
hs_init(&argc, argv);
#ifdef __GLASGOW_HASKELL__
#include "Fib_stub.h"
extern void __stginit_Fib ( void );
hs_add_root(__stginit_Fib);
#endif
return (fibonacci_hs($n));
hs_exit();
(and in addition there are includes for <stdio.c> and "HsFFI.h"
somewhere preceding the above).
--
Colin Adams
Preston Lancashire
More information about the Glasgow-haskell-users
mailing list