haskell — `cabal repl` вызывает GHC панику на простом проекте с файлами C ++

Я загрузил проект в виде zip-файла, чтобы вы могли его опробовать.
https://dl.dropboxusercontent.com/u/35032740/ShareX/2015/11/Buggy.zip

Я хотел написать обертку вокруг библиотеки клиперов. Код прекрасно компилируется с 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:          lukahorvat9@gmail.com
-- 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, 64bit.

1

Решение

Я не знаю деталей форматов объектных файлов в Windows, так что я немного догадываюсь.

Наверное clipper.o а также wrapper.o оба определяют слабый символ имени _ZNSt6vectorIN10ClipperLib8IntPointESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_, (Я вижу то же самое в Linux.) Это, вероятно, произошло от создания шаблона (из vector). Слабые символы инструктируют системный компоновщик просто выбирать любую копию символа, если он встречает дубликаты.

GHCi в Windows не использует системный компоновщик, у него есть собственный компоновщик времени выполнения, который может загружать объектные файлы в себя во время работы. В результате он, как правило, несовместим с системным компоновщиком. Вероятно, компоновщик времени выполнения не понимает слабые символы, по крайней мере, в Windows (https://ghc.haskell.org/trac/ghc/ticket/3333). Исходя из полученной ошибки, мы можем предположить, что она обрабатывает их как обычные символы, и два обычных символа не могут иметь одинаковое имя.

Как обходной путь, вы можете создавать свои файлы C ++ с -fno-weak как описано в https://stackoverflow.com/a/26454930/190376.

Если это не сработает, альтернативой является создание ваших файлов C ++ в DLL, которую вы можете загрузить GHCi с помощью системного динамического загрузчика, избегая всей этой проблемы. В Linux это будет выглядеть

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

хотя я думаю, что детали отличаются на Windows.

2

Другие решения

Конкретная ошибка — это не то, что я привык видеть, но обратная косая черта говорит, что вы работаете в Windows, а в остальном это выглядит так Ошибка GHC # 3242 который причинял боль в течение многих лет. Хорошие новости: причина была окончательно выяснена две недели назад. Плохая новость: исправление не сделало крайний срок для 7.10.3, хотя, по крайней мере, этап 8.0.1 кажется безопасным на данный момент.

Вероятно, все же стоит опубликовать ваш текст ошибки в ветке этой ошибки; моё предположение только образованное, кто-то там наверняка узнает.

1