Haskell 为ffi运行hs_init(0,0)时出现分段错误

Haskell 为ffi运行hs_init(0,0)时出现分段错误,haskell,ffi,Haskell,Ffi,我试图从python调用Haskell函数。 我有以下文件: GHC=ghc GHC_RUNTIME_LINKER_FLAG=-lHSrts-ghc7.4.1 libffi-example.so: Example.o wrapper.o $(GHC) -o $@ -shared -dynamic -fPIC $^ $(GHC_RUNTIME_LINKER_FLAG) Example_stub.h Example.o: Example.hs $(GHC) -c -dynamic

我试图从python调用Haskell函数。 我有以下文件:

GHC=ghc
GHC_RUNTIME_LINKER_FLAG=-lHSrts-ghc7.4.1

libffi-example.so: Example.o wrapper.o
    $(GHC) -o $@ -shared -dynamic -fPIC $^ $(GHC_RUNTIME_LINKER_FLAG)

Example_stub.h Example.o: Example.hs
    $(GHC) -c -dynamic -fPIC Example.hs

wrapper.o: wrapper.c Example_stub.h
    $(GHC) -c -dynamic -fPIC wrapper.c

clean:
    rm -f *.hi *.o *_stub.[ch]

clean-all:
    rm -f *.hi *.o *_stub.[ch] *.so


# Runs the example Python program
example: libffi-example.so
    python program.py
wrapper.c的唯一功能是通过调用
hs_init(0,0)为
hs_init
创建包装器。包装器被称为
example\u init

我在运行
make example
时,在
example\u init
中(即调用
hs\u init(0,0)
时)出现分段错误

有人能告诉我为什么会这样和/或如何修复它吗

谢谢

它应该起作用:

此外,
hs_init()

这似乎是ghc-7.2.1至ghc-7.4.1中的一个错误:

RFib.hs:

{-# LANGUAGE ForeignFunctionInterface #-}
module RFib where

fib :: Int -> Int
fib n
    | n >= 0    = go 0 1 n
    | even n    = -go 0 1 (-n)
    | otherwise = go 0 1 (-n)
      where
        go a _ 0 = a
        go a b k = go b (a+b) (k-1)

foreign export ccall "rfib" fib :: Int -> Int
rfib.c:

{-# LANGUAGE ForeignFunctionInterface #-}
module RFib where

fib :: Int -> Int
fib n
    | n >= 0    = go 0 1 n
    | even n    = -go 0 1 (-n)
    | otherwise = go 0 1 (-n)
      where
        go a _ 0 = a
        go a b k = go b (a+b) (k-1)

foreign export ccall "rfib" fib :: Int -> Int
#包括
#包括
int-rfib(int);
内部主(空){
hs_init(0,0);
printf(“%d\n”,rfib(35));
hs_退出();
返回0;
}
编译并运行:

$rm rfib.o rfib.hi rfib.o a.out
$ghc-7.0.2-氧气-墙壁-无hs主RFib.hs RFib.c&./a.out
[1/1]编译RFib(RFib.hs,RFib.o)
链接a.out。。。
9227465
$rm rfib.o rfib.hi rfib.o a.out
$ghc-7.0.4-氧气-墙壁-无hs主RFib.hs RFib.c&./a.out
[1/1]编译RFib(RFib.hs,RFib.o)
链接a.out。。。
9227465
$rm rfib.o rfib.hi rfib.o a.out
$ghc-7.2.1-氧气-墙壁-无hs主RFib.hs RFib.c&./a.out
[1/1]编译RFib(RFib.hs,RFib.o)
链接a.out。。。
斯皮彻祖格里夫费勒
$rm rfib.o rfib.hi rfib.o a.out
$ghc-7.2.2-氧气-墙壁-无hs主RFib.hs RFib.c&./a.out
[1/1]编译RFib(RFib.hs,RFib.o)
链接a.out。。。
斯皮彻祖格里夫费勒
$rm rfib.o rfib.hi rfib.o a.out
$ghc-7.4.1-氧气-墙壁-无hs主RFib.hs RFib.c&./a.out
[1/1]编译RFib(RFib.hs,RFib.o)
链接a.out。。。
斯皮彻祖格里夫费勒
$rm rfib.o rfib.hi rfib.o a.out
$ghc-7.4.2-氧气-墙壁-无hs主RFib.hs RFib.c&./a.out
[1/1]编译RFib(RFib.hs,RFib.o)
链接a.out。。。
9227465
$rm rfib.o rfib.hi rfib.o a.out
$ghc-氧气-墙壁-无hs主RFib.hs RFib.c&./a.out
[1/1]编译RFib(RFib.hs,RFib.o)
链接a.out。。。
9227465
更改
rfib.c
中的两行:

intmain(intargc,char*argv[]){
hs_init(&argc,&argv);
它适用于所有版本(我安装的>=7.0)

所以要解决它

  • 通过
    &argc
    &argv
  • 升级GHC

是两种最明显的方法。

hs_init
使用指向argv和argc的指针。尝试传递正确的指针,例如
hs_init(&argc,&argv);
?非常感谢。将ghc升级到7.4.2与hs_init(NULL,NULL)一起工作。很棒:)