Cabal找不到外国图书馆

xan*_*xan 0 haskell llvm ghc cabal windows-10

最近我试图安装llvm-general-3.5.1.0软件包大约一个星期.基本上我收到此错误:链接.我的情况完全相同.Windows 10,ghc 7.10.2,cabal 1.22.4.0.我用cmake从源代码安装了llvm 3.5.2,一切都很顺利.在llvm/lib目录中,我有*.lib文件(例如LLVMAnalysis.lib).

但不知何故,cabal无法看到这些库并给出了这个令人沮丧的错误:

配置llvm-general-3.5.1.0 ... setup.exe:缺少对外部库的依赖:*缺少C库:LLVMLTO,LLVMObjCARCOpts,LLVMLinker,LLVMipo,LLVMVectorize,LLVMBitWriter,LLVMCppBackendCodeGen,LLVMCppBackendInfo,LLVMTableGen,LLVMDebugInfo,LLVMOption,LLVMX86Disassembler, LLVMX86AsmParser,LLVMX86CodeGen,LLVMSelectionDAG,LLVMAsmPrinter,LLVMX86Desc,LLVMX86Info,LLVMX86AsmPrinter,LLVMX86Utils,LLVMJIT,LLVMIRReader,LLVMAsmParser,LLVMLineEditor,LLVMMCAnalysis,LLVMMCDisassembler,LLVMInstrumentation,LLVMInterpreter,LLVMCodeGen,LLVMScalarOpts,LLVMInstCombine,LLVMTransformUtils,LLVMipa,LLVMAnalysis,LLVMProfileData,LLVMMCJIT,LLVMTarget, LLVMRuntimeDyld,LLVMObject,LLVMMCParser,LLVMBitReader,LLVMExecutionEngine,LLVMMC,LLVMCore,LLVMSupport这个问题通常可以通过安装系统包,提供这些库解决(你可能需要"-dev"版本).如果库已经安装但是在非标准位置,那么您可以使用标志--extra-include-dirs =和--extra-lib-dirs =来指定它们的位置.

我真的想在我的Windows上使用这个软件包,但似乎没有任何工作(我尝试了所有的东西,如--extra-lib-dirs,并与MinGW和VS一起编译 - 同样的问题).

我不能接受它不会安装的事实.我的意思是,必须有一些方法来修复此cabal包中的Setup.hs.有没有人知道在这种情况下cabal有什么问题,我该如何尝试解决这个问题?我不知道cabal究竟是如何运作的,也许有这种知识的人会有想法?或者也许有一种方法可以做到这一点没有cabal?

arr*_*owd 6

好吧,我已经设法建立它,我认为,找到了问题的根源.

首先,构建步骤:

  1. 获得MinGW.我安装的MinGW有gcc 4.8.

  2. 获得32位MinGHC.

  3. 使用MinGW的gcc编译LLVM 3.5并将其安装在某处.

  4. 将MinGW安装目录的内容复制到MinGHC Install Dir\ghc-7.10.2\mingw,替换冲突文件.

  5. 在命令行中设置PATH,使其具有来自MinGHC的haskell工具集(我建议使用switch .bat脚本)和llvm-config.exe.

  6. 从hackage llvm-general使用cabal fetch或通过浏览器下载获取包源.

  7. 替换cc-options: -std=c++11的行llvm-general.cabalcc-options: -std=gnu++11.

  8. 最后,cabal configurecabal build应工作.

我一直在改变我的构建环境,所以如果这对你不起作用,请告诉我,我可能会忘记一些事情.


现在让我们详细介绍一下.

实际上,我们认为是阴谋集团的错误.问题是两者stackMinGHC(并且Haskell Platform,我猜)使用相当旧gcc- 4.6.这个gcc甚至有两个缺陷:

  • 它不支持,-std=c++11并且无法使用它构建LLVM 3.5.因此,在编译llvm-general时,ghc不能使用此gcc,因为它无法正确解析LLVM头.
  • 即使可以,它的链接器也不能使用gcc 4.8链接MinGW编译的LLVM库.就是为什么cabal告诉你它无法找到LLVM库.我已经入侵了,Setup.hs所以它不会寻找这些库,而是-lLLVMSomething通过-pgml ghc选项传递给链接器.这导致明确的错误消息:

    ld.exe: ignoring libLLVMSupport.a ...
    ld.exe: can't find -lLLVMSupport
    
    Run Code Online (Sandbox Code Playgroud)

所以,cabal 真正找到这些库,但一度下探他们,因为他们无法联系到.

理想情况下,解决方案是更新stack/MinGHC使用的mingw分布.但作为一种解决方法,您可以用新的gcc替换旧的gcc.

最后-std=gnu++11使用是因为当前的MinGW版本受此错误影响,这会阻止编译包的c ++位.哇,这还有很长的路要走.