如何使GHCi加载并解释一个带有“foreign export”声明的模块(用于与C进行FFI)?

3

我有一个模块(Safe.hs),其中包含以下内容:

foreign export ccall respond_hs :: CWString -> IO CWString

针对 C 的 FFI。

我想在 GHCi 中加载 Safe.hs 并对其中的一些内容进行评估。

但是,ghci 无法加载它(我正在指定两个源文件,因为它依赖于 valencies.lhs):

$ ghci src/valencies.lhs src/Safe.hs 
GHCi, version 7.6.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 2] Compiling Valencies        ( src/valencies.lhs, interpreted ) [flags changed]

[2 of 2] Compiling Safe             ( src/Safe.hs, interpreted )

src/Safe.hs:10:1:
    Illegal foreign declaration: requires via-C, llvm (-fllvm) or native code generation (-fvia-C)
    When checking declaration:
      foreign export ccall "respond_hs" respond_hs
        :: CWString -> IO CWString
Failed, modules loaded: Valencies.
*Valencies> :q
Leaving GHCi.
$ 

使用-fvia-C选项并没有帮助。

相关问题

  • 这不同于使用GHCi测试FFI代码的问题,那里的重点是使用C库中的foreign import(而不是export)来测试Haskell代码。

  • GHCi与FFI导出声明/共享库不兼容对我来说很奇怪,因为它没有帮助我。它处理了从Haskell到C的foreign export,但解决的问题是一些缺失的目标文件。

1个回答

7

实际上,正如Dirk Thierbach所说的那样,在这种情况下有两个有用的选项:

如果您查阅GHC手册中的-fvia-C,部分标志参考, 您将被重定向到第4.10.6节(影响代码生成的选项)。在那里,您会发现,在-fvia-C附近:

-fobject-code

生成目标代码。这是GHCi之外的默认值,并且可以与GHCi一起使用,以使对象代码优先于字节码生成。

-fbyte-code

生成字节码而不是目标代码。这是GHCi中的默认设置。字节码目前仅可在交互式解释器中使用,不能保存到磁盘。此选项只有在需要撤销-fobject-code的效果时才有用。

这就解释了为什么它可以在GHC中工作,但不能在GHCI中工作。

因此,我现在很高兴地执行ghci -fobject-code src/valencies.lhs src/Safe.hs

相关问题

  • GHCi无法使用FFI导出声明/共享库 对我来说一开始看起来很混乱,因为它没有帮助到我。它也涉及从Haskell到C的foreign export,但那里解决的问题是一些缺失的目标文件,你必须将它们提供给GHCi以便它链接所有内容。在我的情况下,我只是省略了与程序的C部分链接,因为我不需要测试Haskell模块的C部分。重新阅读那个问答后,我可以猜测给GHCi一个.o文件可能会简单地将GHCi静默地切换到正确的模式!

如果你只想测试Haskell模块,并且如果它的函数可以在与C函数隔离的情况下工作(即它们不调用C函数),我认为我发现的选项比添加更多.o文件到命令行以使GHCi链接所有内容的方式更简单(你看,可能还有进一步的要求,需要与其他包中的某些C函数链接,但这对你来说并不重要)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接