2014-01-22 17 views
13

當運行導入幾個包像這樣的Haskell程序:解決GHC「我找到了符號的重複定義...」

import Text.Feed.Import 
import Network.HTTP 

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

我得到一個錯誤,像這樣的(注:這個問題所要解決的一般問題,這種特定的情況只是一個例子):如所描述的in this previous post

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 

重新安裝封裝(例如在上述情況下HTTPfeed)沒有幫助。我該如何解決這個問題?

回答

23

爲什麼這個錯誤發生

這個問題是不特定(它是三年前描述here有關耶索德例如)一個包,但被導入不同的庫引起的(如HTTPfeed)鏈接到單個庫的不同版本(此問題僅適用於導出C樣式符號的庫,它們的符號名稱不是唯一的,time是其中一個包)。

如錯誤消息中所示,導致此特定情況下的問題的庫爲time-1.4.0.1

診斷確切的問題

首先,你需要確定不同的版本庫的存在。您可以通過使用ghc-pkg describe <packagename>來檢查軟件包,或者查看您的cabal安裝目錄(通常爲~/.cabal/lib)來執行此操作。

在編寫本文時,問題是由安裝time-1.4.0.1time-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標誌(感謝John J. Camilleri指出了這一點!)。請注意,如果沒有軟件包依賴於所述有問題的軟件包,它將被刪除。

+1

或者您可以使用沙盒構建來確保每個包得到一致的一組代碼。 –

+1

感謝您在SO上記錄此信息。 –

+4

爲了找出哪些軟件包依賴有問題的庫,只需使用'ghc-pkg unregister'而不用'--force'標誌。 –

相關問題