我有以下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
VennDiagram
同样的问题。
答案 0 :(得分:1)
当您提供.o
个文件作为GHC的输入时,它不知道它们是否来自Haskell模块。因此,它无法知道需要链接哪些Haskell依赖项。
您可以在链接命令行上手动指定依赖项(例如-package aeson
),或者在链接命令行上提供原始Haskell模块,在这种情况下,GHC将自动确定依赖项。