为什么GHC需要很长时间才能链接?

时间:2011-08-05 06:40:12

标签: haskell

>cabal update
>cabal install cabal-install
.......
[43 of 44] Compiling Distribution.Client.Install ( Distribution/Client/Install.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Install.o )
[44 of 44] Compiling Main             ( Main.hs, dist/build/cabal/cabal-tmp/Main.o )
Linking dist/build/cabal/cabal ..

然后我将等待很长时间才能完成链接。

此致!

3 个答案:

答案 0 :(得分:12)

很可能是链接器本身。来自binutils的标准ld已知很慢。如果你想加快速度(并且有点生活),请尝试安装Gold linker。在Ubuntu(我假设Debian),那将是:

sudo apt-get install binutils-gold

我已经在我的家庭系统上使用它一段时间了,还没有问题。

答案 1 :(得分:7)

这应该是评论,但我不能在评论中格式化这样的代码:

我设法使用gold作为GHC使用的链接器,通过安装/usr/bin/ld.gold: --hash-size=31: unknown option(如Michael Snoyman的回答中所建议的那样)解决标准的ghc-with-gold错误,如binutils-gold,然后替换通过以下脚本编写符号链接/usr/bin/ld(使用chmod +x生成可执行文件):

#!/usr/bin/env python2

import sys
import os
import subprocess


tofilter = [
    "--hash-size",
    "--reduce-memory-overheads",
]

filtered = [ a for a in sys.argv if not any(a.startswith(p) for p in tofilter) ]
filtered[0] = "/usr/bin/ld.gold"

subprocess.check_call(subprocess.list2cmdline(filtered))

请注意,尝试使用ghc -pgml /usr/bin/ld.goldghc -pgml /usr/bin/ld.whateverElse设置链接器是不够的,因为-pgml的参数需要替代GCC,而不是LD。 GHC呼叫GCC,呼叫/usr/bin/ld;这就是上述脚本的原因。

答案 2 :(得分:3)

GHC默认会创建一个独立的库/可执行文件(静态链接)。

现在支持动态链接一段时间,因此您可以尝试启用它。由于工作量较少,链接器可能会快得多。另一方面,您需要确保在执行时可以使用您所依赖的动态库(Linux上的LD_LIBRARY_PATH变量)。