Я загрузил проект в виде 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: [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, 64bit.
Я не знаю деталей форматов объектных файлов в 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.
Конкретная ошибка — это не то, что я привык видеть, но обратная косая черта говорит, что вы работаете в Windows, а в остальном это выглядит так Ошибка GHC # 3242 который причинял боль в течение многих лет. Хорошие новости: причина была окончательно выяснена две недели назад. Плохая новость: исправление не сделало крайний срок для 7.10.3, хотя, по крайней мере, этап 8.0.1 кажется безопасным на данный момент.
Вероятно, все же стоит опубликовать ваш текст ошибки в ветке этой ошибки; моё предположение только образованное, кто-то там наверняка узнает.