解决GHC'我发现符号的重复定义......'

时间:2014-01-22 00:45:14

标签: haskell ghc cabal

当运行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

按照in this previous post所述重新安装软件包(例如上述案例中的HTTPfeed)无济于事。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:23)

为什么会出现此错误

此问题并非特定于单个程序包(例如三年前与Yesod相关的here),但是由您导入的不同库引起(例如HTTP和{{ 1}})链接到单个库的不同版本(此问题仅适用于导出C样式符号的库。它们的符号名称不唯一。feed是其中一个包。)。

如错误消息所示,导致此特定情况下的问题的库为time

诊断确切问题

首先,您需要确定库中存在哪些不同的版本。您可以使用time-1.4.0.1检查软件包,或者只查看ghc-pkg describe <packagename>安装目录(通常是cabal)。

在撰写本文时,问题是由安装了~/.cabal/libtime-1.4.0.1引起的。使用time-1.4.1我发现ghc-pkg describe(在我的情况下只有feed),链接到feed,而大约有100个图书馆链接到time-1.4.1。< / p>

如何解决

识别(如错误消息中所示)导致错误的库的库版本,如上所述,更少的包依赖于该版本。您需要重建依赖它的所有包。就我而言,这是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标记(感谢John J. Camilleri指出来!)。请注意,如果没有包依赖于所述有问题的包,它将被删除。