使GHCi加载并解释具有"外部出口的模块"声明(对于带有C的FFI)?

时间:2015-03-06 13:18:37

标签: haskell ghci ffi

我有一个模块(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选项无济于事。

相关问题

1 个答案:

答案 0 :(得分:5)

实际上,作为told by 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 doesn't work with FFI export declarations/shared libaries对我来说首先看起来很乱,因为它对我没有帮助。它也处理从Haskell到C的foreign export,但问题解决了一些丢失的目标文件,你必须给GHCi链接一切。在我的例子中,我只是省略了与程序的C部分的链接,因为我不需要它来测试Haskell模块。在重新阅读Q& A之后,我可以怀疑给GHCi .o只是默默地将GHCi切换到正确的模式!

如果你想要的只是测试Haskell模块,并且它的功能可以独立于C函数工作(即,它们不能调用C函数),我相信我发现的选项是一种更简单的方法而不是将更多.o文件添加到命令行以使GHCi链接所有内容(您看,可能还有其他要求与其他软件包中的某些C函数链接,这对您来说并不重要)。