Подтвердить что ты не робот

Почему GHC так долго связывается?

>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 ..

то я буду ждать ОЧЕНЬ долгое время, чтобы он завершил связывание.

С уважением!

4b9b3361

Ответ 1

Скорее всего, это сам компоновщик. Известно, что стандартный ld из binutils является медленным. Если вы хотите ускорить работу (и немного поработайте на грани), попробуйте установить Gold linker. На Ubuntu (и я предполагаю Debian) это будет:

sudo apt-get install binutils-gold

Я использую его в своей домашней системе какое-то время, никаких проблем.

Ответ 2

Это должен быть комментарий, но я не могу форматировать такой код в комментариях:

Мне удалось использовать золото в качестве компоновщика, используемого GHC, работая над стандартными ошибками ghc-with-gold, такими как /usr/bin/ld.gold: --hash-size=31: unknown option, установив binutils-gold (как было предложено в ответе Майкла Снояна), а затем заменив символическую ссылку /usr/bin/ld следующим образом: script (выполнил исполняемый файл с 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.gold или ghc -pgml /usr/bin/ld.whateverElse недостаточно, потому что аргумент -pgml должен быть заменой для GCC, а не LD. GHC вызывает GCC, который вызывает /usr/bin/ld; поэтому работает выше script.

Ответ 3

GHC по умолчанию создаст автономную библиотеку/исполняемый файл (статическая привязка).

Динамическое связывание поддерживается некоторое время, поэтому вы можете попробовать включить его. С меньшим количеством работы, компоновщик, вероятно, будет намного быстрее. С другой стороны, вам нужно убедиться, что во время выполнения доступны динамические библиотеки, на которые вы полагаетесь (переменная LD_LIBRARY_PATH в Linux).