Data.Aeson与ghc中的ForeignFunctionInterface

时间:2017-04-10 14:09:13

标签: c++ haskell ghc aeson

我有以下haskell代码:

aeson

$ ghci Prelude> :load BoardToJSON *BoardToJSON> writef 安装了cabal。

做的时候:

foreign export ccall writef :: IO ()

我正在编写一个包含件数组的Json文件。

但是,取消评论CPP_SOURCES = main.cpp HASKELL_SOURCES = haskell/BoardToJSON.hs OBJECTS = haskell/*.o *.o main: compileHaskell compileCPP link clean; compileHaskell: $(HASKELL_SOURCES); ghc -c -XForeignFunctionInterface -fforce-recomp -O $(HASKELL_SOURCES) compileCPP: $(CPP_SOURCES); g++ -c -I/usr/lib/ghc/include -O $(CPP_SOURCES) link: ; ghc -o Main -no-hs-main $(OBJECTS) -lstdc++ clean: ; rm -rf main && rm -rf haskell/*.o && rm *.o && rm -rf haskell/*.hi && rm -rf haskell/*_stub.h 并使用以下内容进行编译时

compileHaskell

compileCPP/tmp/ghca1ca_0/ghc_8.o:(.data.rel.ro+0x2a8): undefined reference to `bytestringzm0zi10zi8zi1_DataziByteStringziLazzy_getContents2_closure' collect2: error: ld returned 1 exit status `gcc' failed in phase `Linker'. (Exit code: 1) makefile:12: recipe for target 'link' failed 没问题,但我收到了一堆类型的错误:

aeson

我的猜测是ghc不知道在哪里找到$ sudo echo "/root/.cabal/lib/x86_64-linux-ghc-8.0.2" > /etc/ld.so.conf.d/x86_64-linux-gnu.conf $ sudo ldconfig $ sudo ldconfig -v | grep -i aeson ldconfig: Path `/lib/x86_64-linux-gnu' given more than once ldconfig: Path `/usr/lib/x86_64-linux-gnu' given more than once ldconfig: /lib/x86_64-linux-gnu/ld-2.24.so is the dynamic linker, ignoring libHSaeson-1.1.1.0-4sfmSwjYSZ4CJzSxs6L5hG-ghc8.0.1.so -> libHSaeson-1.1.1.0-4sfmSwjYSZ4CJzSxs6L5hG-ghc8.0.1.so 所以我做了:

-llibHSaeson

没机会。

我尝试添加-lHSaeson-laeson--enable-shared来链接目标。但没有任何效果。

有什么想法吗?

修改

经过进一步研究,我尝试用$ cabal install aeson --enable-shared --reinstall

重新安装aeson
VennDiagram

同样的问题。

1 个答案:

答案 0 :(得分:1)

当您提供.o个文件作为GHC的输入时,它不知道它们是否来自Haskell模块。因此,它无法知道需要链接哪些Haskell依赖项。

您可以在链接命令行上手动指定依赖项(例如-package aeson),或者在链接命令行上提供原始Haskell模块,在这种情况下,GHC将自动确定依赖项。