Связывание строк байтов в ghc

Рассмотрим следующий простой код:

import Crypto.Hash.SHA1 (hashlazy)
import qualified Data.ByteString as BS
main = return ()

Я установил cabal install --global bytestring, а затем получил (на недавно установленной машине Ubuntu 12.04 с использованием ghc 7.4.1):

GHCi runtime linker: fatal error: I found a duplicate definition for symbol
   fps_minimum
whilst processing object file
   /usr/local/lib/bytestring-0.10.0.1/ghc-7.4.1/HSbytestring-0.10.0.1.o
This could be caused by:
   * Loading two different object files which export the same symbol
   * Specifying the same object file twice on the GHCi command line
   * An incorrect `package.conf' entry, causing some object to be
     loaded twice.
GHCi cannot safely continue in this situation.  Exiting now.  Sorry.

Что я могу с этим сделать?


person Cartesius00    schedule 06.11.2012    source источник
comment
Для какой версии bytestring был создан cryptohash?   -  person Daniel Fischer    schedule 06.11.2012
comment
@DanielFischer Hackage говорит, что cryptohash 0.7.6 был построен с использованием ghc 7.6 (я использую 7.4). Может ли это быть проблемой?   -  person Cartesius00    schedule 07.11.2012
comment
Нет, я имел в виду тот, который у вас есть. ghc-pkg describe cryptohash будет перечислять что-то вроде bytestring-0.10.0.0-b8146809d010d5e46cdb979e5b99953f в поле зависимостей. Если это не та же версия bytestring, что и import qualified Data.ByteString as BS, у вас есть ошибка повторяющегося символа.   -  person Daniel Fischer    schedule 07.11.2012
comment
@DanielFischer О, спасибо! Опишите отпечатки: bytestring-0.9.2.1-18f26186028d7c0e92e78edc9071d376 но у меня установлено bytestring-0.10.0.1, так что проблема в этом, верно?   -  person Cartesius00    schedule 07.11.2012
comment
Верно, вам нужно перестроить криптохэш против нового bytestring или указать ghc(i) использовать старый всякий раз, когда вы используете криптохеш. - Обратите внимание, что вам может понадобиться пересобрать и другие пакеты.   -  person Daniel Fischer    schedule 07.11.2012
comment
@DanielFischer Отлично. Спасибо.   -  person Cartesius00    schedule 07.11.2012


Ответы (1)


Это проблема зависимости от бриллианта. У вас есть версия криптохэша, созданная для одной версии байтовой строки, но остальная часть системы GHC построена для другой. Таким образом, когда пакеты линкуются вместе, линкуются две слегка отличающиеся друг от друга версии байтовой строки.

Обычно это нормально, если типы строк байтов совместимы.

Тем не менее, bytestring включает небольшую библиотеку C для некоторых утилит. Библиотеки C имеют неуникальные символы, которые предотвращают дублирование ссылок, следовательно, ваша ошибка.

Вы должны убедиться, что криптохэш построен для той же версии байтовой строки.

person Don Stewart    schedule 15.11.2012