Haskell 为ffi运行hs_init(0,0)时出现分段错误
我试图从python调用Haskell函数。 我有以下文件: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
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)一起工作。很棒:)