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

e4yzc0pl  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(174)
>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 ..

然后我会等待很长一段时间,它完成链接。

czq61nw1

czq61nw11#

很有可能是链接器本身的问题。binutils的标准ld速度很慢。如果你想加快速度(并在边缘生活一点),尝试安装Gold linker。在Ubuntu(我假设是Debian)上,这将是:

sudo apt-get install binutils-gold

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

ppcbkaq5

ppcbkaq52#

这应该是一个注解,但我不能在注解中设置这样的代码格式:
我设法使用gold作为GHC使用的链接器,通过安装binutils-gold(如Michael Snoyman的答案中所建议的),然后用以下脚本替换符号链接/usr/bin/ld(用chmod +x使其可执行),解决了标准的ghc与gold错误,如/usr/bin/ld.gold: --hash-size=31: unknown option

#!/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的参数需要替换愚者,而不是LD。GHC调用愚者,愚者调用/usr/bin/ld;这就是上面的脚本工作的原因。

rvpgvaaj

rvpgvaaj3#

默认情况下,GHC将创建一个独立的库/可执行文件(静态链接)。
动态链接已经被支持了一段时间,所以你可以试着打开它。由于要做的工作更少,链接器可能会更快。另一方面,你需要确保在执行时你所依赖的动态库是可用的(Linux上的LD_LIBRARY_PATH变量)。

相关问题