【问题标题】:Cabal can't find foreign libraries阴谋集团找不到外国图书馆
【发布时间】:2015-11-16 19:51:20
【问题描述】:

最近我试图安装llvm-general-3.5.1.0 包.. 大约一个星期。基本上我收到了这个错误:link。我的情况是一样的。 Windows 10、ghc 7.10.2、阴谋集团 1.22.4.0。我使用 cmake 从源代码安装了 llvm 3.5.2,一切正常。在 llvm/lib 目录中,我有 *.lib 文件(例如 LLVMAnalysis.lib)。

但不知何故,阴谋集团看不到这些库并给出了这个令人沮丧的错误:

正在配置 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、 LLVM 支持 这个问题通常可以通过安装系统包来解决 提供这些库(您可能需要“-dev”版本)。如果图书馆 已经安装但在非标准位置,那么您可以使用 标记 --extra-include-dirs= 和 --extra-lib-dirs= 以指定它们的位置。

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

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

【问题讨论】:

  • 您阅读了整个问题吗?这是cabal bug
  • @Zeta,我不认为它被正式认为是一个错误。该线程中没有一个回复。你是说在阴谋集团的作者修复这个错误之前什么都做不了,我不能安装这个包?
  • 由于您能够重现错误,因此在线程上的回复会提高一些认识。话虽如此,我不知道有多少 cabal 开发人员使用 Windows 10。我目前在 Linux 上,但我稍后会尝试在 Win8 上重现它。
  • 谢谢@Zeta,那太好了。
  • 抱歉,昨天我在使用 LLVM 时遇到了几个问题,无法正常工作。显然,LLVM 不喜欢我的 MinGW 配置。

标签: haskell llvm windows-10 ghc cabal


【解决方案1】:

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

首先,构建步骤:

  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 或 通过浏览器从 hackage 下载。

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

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

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


现在让我们进入细节。

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

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

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

所以,cabal 实际上找到了这些库,但是因为无法链接到它们而放弃了它们。

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

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

【讨论】:

  • 谢谢!今天我注意到我实际使用的 gcc 版本与 Haskell 平台目录中的版本之间存在差异。它们分别为 4.8 和 4.6。后者用于安装软件包,因此显然它不能与 llvm-general 一起使用。我不知道如何解决它,我按照你的步骤操作。它安装了这个包!然而,你能用吗?我在 Haskell 中编写了简单的 hello world 并添加了一个导入:'import LLVM.General.Analysis'。
  • 它给出了很多错误,例如:'C:\LLVM\llvm-3.5.2/lib/libLLVMDebugInfo.a(DWARFDebugLine.o):(.text+0x74c): undefined reference to `operator new(unsigned int)'' 在编译期间。所以它以:'collect2.exe:错误:ld 返回 1 退出状态'结束。我是否遗漏了一些明显的东西,或者必须做一些额外的工作来编译它?
  • 我尝试编译:'ghc Main.hs --make'。也许我应该在这个命令中添加一些东西?或者更确切地说,这个包还有什么问题?
  • 此程序的此命令适用于 Ubuntu。所以编译器肯定还有一些问题阻止我使用 llvm-general 包。
  • 是的,它对我来说既适用于ghc --make,也适用于创建一个依赖于 llvm-general 和 cabal building 的全新包。您在通过 MinGHC 复制时没有删除 MinGW 目录?
猜你喜欢
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多