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

Решение GHC "Я нашел дублирующее определение для символа..."

При запуске программ Haskell, которые импортируют несколько пакетов, таких как:

import Text.Feed.Import 
import Network.HTTP

main = do
        page <- simpleHTTP (getRequest "http://stackoverflow.com")
        print $ page

Я получаю ошибку, подобную этой (Примечание: этот вопрос намеревается решить общую проблему, этот конкретный случай является лишь примером):

GHCi runtime linker: fatal error: I found a duplicate definition for symbol get_current_timezone_seconds
whilst processing object file
   /usr/lib/ghc/time-1.4.0.1/HStime-1.4.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

Переустановка пакетов (например, HTTP и feed в приведенном выше случае), как описано в этом предыдущем сообщении, не помогает. Как я могу решить эту проблему?

4b9b3361

Ответ 1

Почему возникает эта ошибка

Эта проблема не специфична для одного пакета (например, он был описан здесь в отношении Yesod три года назад), но вызвано с помощью различных библиотек, которые вы импортируете (например, HTTP и feed), ссылающихся на разные версии одной библиотеки (эта проблема возникает только для библиотек, которые экспортируют символы стиля C. Их имена символов не уникальны. time из этих пакетов.).

Как указано в сообщении об ошибке, библиотека, которая вызывает проблемы в этом конкретном случае, составляет time-1.4.0.1.

Диагностика точной проблемы

Во-первых, вам нужно определить, какие разные версии существуют в вашей библиотеке. Вы можете сделать это, проверив пакеты с помощью ghc-pkg describe <packagename> или просто заглянув в каталог установки cabal (обычно ~/.cabal/lib).

Во время написания этого вопроса проблема была вызвана установкой time-1.4.0.1 и time-1.4.1. Используя ghc-pkg describe, я выяснил, что feed (и только feed, в моем случае), связанный с time-1.4.1, тогда как около 100 библиотек связаны с time-1.4.0.1.

Как разрешить

Определите версию библиотеки (библиотеки, которая вызывает ошибку, как указано в сообщении об ошибке), как описано выше, о чем зависит меньшее количество пакетов. Вам нужно будет перестроить все пакеты, зависящие от него. В моем случае это time-1.4.1.

Затем удалите пакет:

$ ghc-pkg unregister time-1.4.1 --force 
unregistering time-1.4.1 would break the following packages: feed-0.3.9.2 (ignoring)

Обратите внимание, что пакет feed теперь сломан, и его необходимо перестроить и переустановить. Однако после перестройки он не будет ссылаться на time-1.4.1, но time-1.4.0.1 (в моем конкретном случае). Эта пересоединение решит проблему с дублирующимся символом.

$ cabal install feed

Если ошибка по-прежнему возникает после этого, повторите проверку всех зависимостей, как описано выше. Вы должны убедиться, что любая библиотека, которую вы импортируете, будет отображать ту же библиотеку, с которой она связана, при анализе с помощью ghc-pkg describe <pkg>

Обновление:. Чтобы узнать, какие пакеты зависят от проблемной библиотеки, просто используйте ghc-pkg unregister без флага --force (спасибо Джон Дж. Камиллери, указав это!). Обратите внимание, что если пакеты не зависят от указанного проблемного пакета, он будет удален.