2015-11-13 55 views
1

我已經上傳項目作爲zip文件,所以你可以嘗試一下。 https://dl.dropboxusercontent.com/u/35032740/ShareX/2015/11/Buggy.zip`cabal repl`導致簡單項目上的GHC恐慌與C++文件

我想圍繞削波器庫編寫一個包裝。代碼編譯罰款與cabal build,與cabal run運行,但cabal repl產生這個錯誤:

Preprocessing executable 'Buggy' for Buggy-0.1.0.0... 
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help 
GHC runtime linker: fatal error: I found a duplicate definition for symbol 
    _ZNSt6vectorIN10ClipperLib8IntPointESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ 
whilst processing object file 
    dist\build\Buggy\Buggy-tmp\wrapper.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. 
ghc.exe: panic! (the 'impossible' happened) 
    (GHC version 7.10.2 for x86_64-unknown-mingw32): 
     loadObj "dist\\build\\Buggy\\Buggy-tmp\\wrapper.o": failed 

Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug 

僅供參考,這裏的陰謀文件

-- Initial Buggy.cabal generated by cabal init. For further documentation, 
-- see http://haskell.org/cabal/users-guide/ 

name:    Buggy 
version:    0.1.0.0 
-- synopsis: 
-- description: 
-- license: 
license-file:  LICENSE 
author:    Luka Horvat 
maintainer:   [email protected] 
-- copyright: 
-- category: 
build-type:   Simple 
-- extra-source-files: 
cabal-version:  >=1.10 

executable Buggy 
    main-is:    Main.hs 
    c-sources:   clipper.cpp 
        , wrapper.cpp 
    -- other-modules: 
    -- other-extensions: 
    build-depends:  base >=4.8 && <4.9 
    -- hs-source-dirs: 
    default-language: Haskell2010 
    extra-libraries:  stdc++ 

任何想法的原因可能是在這裏嗎? 我正在運行Windows 10,64位。

回答

2

我不知道Windows上的目標文件格式的細節,所以我猜測了一下。

可能clipper.owrapper.o都定義爲符號名爲_ZNSt6vectorIN10ClipperLib8IntPointESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_。 (我在Linux上看到了這一點。)這可能來自模板實例化(vector)。弱符號指示系統鏈接程序在遇到重複項時僅挑選該符號的任何副本。

Windows上的GHCi不使用系統鏈接程序,它有自己的運行時鏈接程序,可以在運行時將目標文件加載到自身中。因此,它通常與系統鏈接程序不兼容。運行時鏈接程序可能不理解弱符號,至少在Windows上(https://ghc.haskell.org/trac/ghc/ticket/3333)。從你得到的錯誤中,我們可以假設它將它們視爲常規符號,並且不允許兩個常規符號具有相同的名稱。

作爲解決方法,您可能可以使用-fno-weak構建C++文件,如https://stackoverflow.com/a/26454930/190376中所述。

如果這不起作用,另一種方法是將您的C++文件構建到DLL中,您可以使用系統動態加載程序加載GHCi,從而避免這個問題。在Linux上,這看起來像

g++ wrapper.cpp clipper.cpp -shared -fPIC -o libclipper.so 
ghci -L. -lclipper 

雖然我想在Windows上的細節是不同的。

+0

所以還是有希望的!我會看看它是否有效。 –

+0

是的,它的工作。現在它只是找不到stdC++,我認爲這是由於西奧多的回答。謝謝! –

1

具體的錯誤不是我以前看到的,但那些反斜槓表示你在Windows上,而這看起來像GHC bug #3242,這已經導致多年的痛苦。好消息:兩週前,事情終於被隔離了。壞消息:該修復程序沒有提供7.10.3的最後期限,儘管目前至少8.0.1里程碑似乎是安全的。

可能仍然值得將錯誤文本發佈到該bug的線程;我的只是一個受過教育的猜測,那裏有人肯定會知道。