Cabal 找不到外国图书馆

Cabal can't find foreign libraries

最近我在尝试安装 llvm-general-3.5.1.0 package.. for about a week. Basically I am getting this error: link。我的情况是一样的。 Windows10,ghc 7.10.2,cabal 1.22.4.0。我使用 cmake 从源代码安装了 llvm 3.5.2,一切正常。在 llvm/lib 目录中我有 *.lib 文件(例如 LLVMAnalysis.lib)。

但是 cabal 无法看到这些库并给出了这个令人沮丧的错误:

Configuring llvm-general-3.5.1.0... setup.exe: Missing dependencies on foreign libraries: * Missing C libraries: 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 This problem can usually be solved by installing the system packages that provide these libraries (you may need the "-dev" versions). If the libraries are already installed but in a non-standard location then you can use the flags --extra-include-dirs= and --extra-lib-dirs= to specify where they are.

我真的很想在我的 Windows 上使用这个包,但似乎没有任何效果(我尝试了 --extra-lib-dirs 之类的所有东西,并且还使用 MinGW 和 VS 进行了编译——同样的问题)。

我无法接受它无法安装的事实。我的意思是,必须有一些方法可以从这个 cabal 包或其他东西中修复 Setup.hs。有谁知道在这种情况下 cabal 可能出了什么问题,我该如何解决这个问题?我不知道阴谋集团究竟是如何运作的,也许有这方面知识的人会有一个想法?或者也许有一种方法可以在没有 cabal 的情况下做到这一点?

好的,我已经成功构建了它,并且我认为找到了问题的根源。

首先,构建步骤:

  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,使其具有来自 haskell 的工具集 MinGHC(我建议使用 switch .bat 脚本)和 llvm-config.exe.

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

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

  8. 最后,cabal configurecabal build 应该可以了。

我已经多次更改我的构建环境,所以如果这对你不起作用请告诉我,我可能忘记了什么。


现在让我们进入细节。

我们认为是 cabal 的错误,实际上不是。问题是 stackMinGHC(我猜 Haskell Platform)都使用相当旧的 gcc - 4.6。这个gcc甚至有两个缺陷:

  • 它不支持 -std=c++11 并且无法使用它构建 LLVM 3.5。 结果这个gcc在编译的时候不能被ghc使用 llvm-general,因为它无法正确解析 LLVM headers。
  • 即使可以,它的 linker 也不能 link 针对由 MinGW 使用 gcc 4.8。 就是 cabal 告诉你的原因 找不到 LLVM 库。我破解了 Setup.hs 所以它不会 查找这些库,但通过 -pgml-lLLVMSomething 传递给 linker ghc 选项。这导致明确的错误消息:

    ld.exe: ignoring libLLVMSupport.a ...
    ld.exe: can't find -lLLVMSupport
    

因此,cabal 实际上找到了这些库,但由于无法 link 编辑而放弃了它们。

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

最后,使用 -std=gnu++11,因为当前 MinGW 版本是 affected by this bug,这会阻止编译包的 c++ 位。哇,那是很长的路要走。