我有一个模块(Safe.hs)
foreign export ccall respond_hs :: CWString -> IO CWString
Run Code Online (Sandbox Code Playgroud)
用于FFI与C.
我想加载Safe.hsGHCi并用它来评估一些东西.
但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.
$
Run Code Online (Sandbox Code Playgroud)
给予-fvia-C选项没有帮助.
这与使用GHCi测试FFI代码有一个不同的问题,其中重点是使用foreign import(而非export)C库测试Haskell代码.
GHCi不能用于FFI导出声明/共享库对我来说似乎很奇怪,因为它对我没有帮助.它处理foreign export从Haskell到C,但问题解决了一些丢失的目标文件.
实际上,正如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从Haskell到C,但问题解决了一些丢失的目标文件,你必须给GHCi链接一切.在我的例子中,我只是省略了与程序的C部分的链接,因为我不需要它来测试Haskell模块.在重新阅读Q&A之后,我可以怀疑给.oGHCi可以简单地将GHCi静音切换到正确的模式!如果您只想测试Haskell模块,并且它的功能可以与C函数隔离开来(即它们不调用C函数),我相信我发现的选项比添加更多.o文件更简单命令行使GHCi链接所有内容(你看,可能还有其他要求与其他软件包中的某些C函数链接,这对你来说并不重要).