我有一个模块(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
选项无济于事。
这是Testing FFI Code with GHCi的另一个问题,其中重点在于使用来自C库的foreign import
(不是export
)来测试Haskell代码。
GHCi doesn't work with FFI export declarations/shared libaries对我来说似乎很奇怪,因为它对我没有帮助。它处理从Haskell到C的foreign export
,但问题解决了一些丢失的目标文件。
答案 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
。
foreign export
,但问题解决了一些丢失的目标文件,你必须给GHCi链接一切。在我的例子中,我只是省略了与程序的C部分的链接,因为我不需要它来测试Haskell模块。在重新阅读Q& A之后,我可以怀疑给GHCi .o
只是默默地将GHCi切换到正确的模式!如果你想要的只是测试Haskell模块,并且它的功能可以独立于C函数工作(即,它们不能调用C函数),我相信我发现的选项是一种更简单的方法而不是将更多.o
文件添加到命令行以使GHCi链接所有内容(您看,可能还有其他要求与其他软件包中的某些C函数链接,这对您来说并不重要)。