Попробуйте импортировать Foreign.C.String
вместо модуля CString
. GHC должен распознать модуль и ссылку в правильной библиотеке. В системе Linux при компиляции static у меня была та же проблема, что и у вас (undefined ref). Когда я изменил этот импорт, оставив меня с приведенным ниже кодом, все работало.
Модуль My Haskell (функции экспорта):
$ cat so.hs
module Adder where
import Foreign.C.String
adder :: Int -> Int -> IO CString
adder x y = newCString(show(x+y))
foreign export ccall adder :: Int -> Int -> IO CString
Мой основной файл C (который включает в себя всю работу по инициализации и удалению, не очень, но это просто учебно):
$ cat soMain.c
#include <Rts.h>
#include "so_stub.h"
extern void __stginit_Adder(void);
void main()
{
char *str = NULL;
int argc = 1;
char* argv[] = {"ghcDll", NULL}; // argv must end with NULL
// Initialize Haskell runtime
char** args = argv;
hs_init(&argc, &args);
// Tell Haskell about all root modules
hs_add_root(__stginit_Adder);
// END INIT
str = adder(1,2);
printf("%s\n",str);
// END MAIN START THE FINALIZERS
hs_exit();
}
Мои команды:
$ ghc -c so.hs
$ ghc soMain.c so_stub.o so.o -o so -fforce-recomp
$ ./so
3
EDIT: просто предположение, но, возможно, импорт CString
сработает, если вы укажете {-# LANGUAGE Haskell98, ForeignFunctionInterface #-}