Сбой в C ++ FFI Exception в Haskell

При использовании FFI для C ++ в Haskell я могу правильно перехватывать исключения при запуске функции в cabal repl, но при работе с cabal runИсключение не поймано.

Простой проект кабалы, который показывает проблему, включен ниже:

exception.cabal:

name:                exception
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10
executable exception
main-is:             Main.hs
c-sources: main.cxx
build-depends:       base >=4.7 && <4.8
default-language:    Haskell2010
extra-libraries:     stdc++

main.cxx:

# include <exception>
# include <stdexcept>

extern "C" int hs_exception() try
{
throw std::logic_error("THIS FAILS!");
} catch(...) {
}

а также

Main.hs:

{-# LANGUAGE ForeignFunctionInterface #-}
module Main where

import Foreign.C.Types (CInt(..))main = print c_hs_exception

foreign import ccall unsafe "hs_exception"c_hs_exception :: CInt

Работая от REPL (т.е. GHCI):

cabal repl
*Main> main
0

Но не удается при компиляции с GHC и побежал:

cabal run
libc++abi.dylib: terminating with uncaught exception of type std::logic_error: THIS FAILS!
[1]    12781 abort      cabal run

Мои компиляторы:

➜ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
➜ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.8.3

7

Решение

Это зависит от Mac, и было сообщено как Ошибка GHC 11829. Исправление состоит в том, чтобы передать флаг -lto_library (LTO = оптимизация времени ссылки) для компоновщика Clang. Это можно сделать с помощью исполняемого раздела файла .cabal следующим образом:

executable myprog
...
if os(darwin)
ld-options: -lto_library

Или флаг -optl-lto_library если звонит ghc непосредственно.

Обратите внимание, что это будет неправильно рекомендовать вам написать extra-libraries: to_library вместо этого, который не будет работать.

1

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


По вопросам рекламы [email protected]