当运行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所述重新安装软件包(例如上述案例中的HTTP
和feed
)无济于事。我该如何解决这个问题?
答案 0 :(得分:23)
为什么会出现此错误
此问题并非特定于单个程序包(例如三年前与Yesod相关的here),但是由您导入的不同库引起(例如HTTP
和{{ 1}})链接到单个库的不同版本(此问题仅适用于导出C样式符号的库。它们的符号名称不唯一。feed
是其中一个包。)。
如错误消息所示,导致此特定情况下的问题的库为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
,而大约有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指出来!)。请注意,如果没有包依赖于所述有问题的包,它将被删除。