如何使用Haskell的C库?

如何使用Haskell的C库?,c,haskell,interop,ffi,C,Haskell,Interop,Ffi,我试图使用FFI从Haskell调用C函数,但一直出现以下错误: ghc.exe:^^无法加载“getSize”,依赖项未解析。见顶部 上面的条目 主:字节码链接:在交互式链接期间找不到标签,GHCi 找不到以下符号:getSize这可能是您造成的 不要求GHCi加载所需的额外对象文件、存档或DLL 您当前的会话。重新启动GHCi,指定缺少的库 使用-L/path/to/object/dir和-lmissinglibname标志,或者简单地 通过在GHCi命令行上命名相关文件。或者, 此链接故障

我试图使用FFI从Haskell调用C函数,但一直出现以下错误:

ghc.exe:^^无法加载“getSize”,依赖项未解析。见顶部 上面的条目

主:字节码链接:在交互式链接期间找不到标签,GHCi 找不到以下符号:getSize这可能是您造成的 不要求GHCi加载所需的额外对象文件、存档或DLL 您当前的会话。重新启动GHCi,指定缺少的库 使用-L/path/to/object/dir和-lmissinglibname标志,或者简单地 通过在GHCi命令行上命名相关文件。或者, 此链接故障可能表示GHCi中存在错误。如果你怀疑 之后,请将错误报告发送至: 格拉斯哥哈斯克尔-bugs@haskell.org

我正在使用C库中的stdio.h库:

C库

//lib.h 包括 双倍getSize{ 双尺寸=0; scanf$f,&size; 返回大小; } 外国金融机构模块

{LANGUAGE ForeignFunctionInterface-} 模块Ffi在哪里 进口国外 导入外国C.C.类型 外部导入ccall lib.h getSize c_size::IO Double 主要

模块主要在哪里 进口外国金融机构 main::IO
main=do a好的,这里有几件事要做:

将lib.h重命名为lib.c。它是包含代码的C源文件,而不是C头文件。 理想情况下,使用getSize的原型添加一个单独的lib.h头文件。 修复lib.c中的错误。您希望%lf代替$f以双精度读取。 使用ghc编译程序,而不是使用runghc运行程序。一个ghc命令可以编译和链接Haskell模块和C代码。 换句话说,您的文件应该如下所示:

//lib.c 包括lib.h 包括 双倍getSize{ 双尺寸=0; 扫描%lf,尺寸(&S); 返回大小; } //lib.h 双getSizevoid; -外国金融机构 {LANGUAGE ForeignFunctionInterface-} 模块Ffi在哪里 进口国外 导入外国C.C.类型 外部导入ccall lib.h getSize c_size::IO Double -Main.hs 模块主要在哪里 进口外国金融机构 main::IO
main=do a好的,这里有几件事要做:

将lib.h重命名为lib.c。它是包含代码的C源文件,而不是C头文件。 理想情况下,使用getSize的原型添加一个单独的lib.h头文件。 修复lib.c中的错误。您希望%lf代替$f以双精度读取。 使用ghc编译程序,而不是使用runghc运行程序。一个ghc命令可以编译和链接Haskell模块和C代码。 换句话说,您的文件应该如下所示:

//lib.c 包括lib.h 包括 双倍getSize{ 双尺寸=0; 扫描%lf,尺寸(&S); 返回大小; } //lib.h 双getSizevoid; -外国金融机构 {LANGUAGE ForeignFunctionInterface-} 模块Ffi在哪里 进口国外 导入外国C.C.类型 外部导入ccall lib.h getSize c_size::IO Double -Main.hs 模块主要在哪里 进口外国金融机构 main::IO
main=为什么.h文件中有代码?您使用什么命令来编译代码?为什么.h文件中有代码?您使用什么命令来编译代码?我还建议用原型编写一个适当的头文件c lib.h。国外进口一个.c文件是很少见的,这很公平。我已经在示例中添加了lib.h。我还建议用原型编写一个适当的头文件c lib.h。国外进口一个.c文件是很少见的,这很公平。我在示例中添加了lib.h。