让 GHCi 加载并解释带有 "foreign export" 声明的模块(对于带有 C 的 FFI)?

Make GHCi load and interpret a module with a "foreign export" declaration (for FFI with C)?

我有一个模块 (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 选项没有帮助。

相关问题

实际上,与 told by Dirk Thierbach 一样,在这种情况下有两个有用的选项:

If you look up -fvia-C in the GHC manual, section flag reference, you're redirected to section 4.10.6 (Options affecting code generation). There you'll find, near -fvia-C:

-fobject-code

Generate object code. This is the default outside of GHCi, and can be used with GHCi to cause object code to be generated in preference to bytecode.

-fbyte-code

Generate byte-code instead of object-code. This is the default in GHCi. Byte-code can currently only be used in the interactive interpreter, not saved to disk. This option is only useful for reversing the effect of -fobject-code.

这解释了为什么它适用于 GHC,但不适用于 GHCI。

所以,我现在很高兴 ghci -fobject-code src/valencies.lhs src/Safe.hs

相关问题

  • GHCi doesn't work with FFI export declarations/shared libaries 一开始我觉得很乱,因为它对我没有帮助。它也处理从 Haskell 到 C 的 foreign export,但是解决的问题是缺少一些目标文件,您必须将这些文件提供给 GHCi 以使其成为 link 所有内容。在我的例子中,我只是省略了程序的 C 部分的 linking,因为我不需要它来测试 Haskell 模块。重读该问答后,我怀疑给 GHCi 一个 .o 可以简单地将 GHCi 悄悄切换到正确的模式!

如果您只想测试 Haskell 模块,并且如果它的函数可以独立于 C 函数工作(即,它们不调用 C 函数),我相信我发现的选项是一种比在命令行中添加更多 .o 文件以使 GHCi link 一切更简单的方法(你看,可能对 link 有来自其他包的一些 C 函数的进一步要求,这对你来说并不重要)。