Проблема с запуском `stack ghci` при вызове C ++ из Haskell

Что я пытаюсь сделать: Я пытаюсь вызвать C ++ (через extern "C" { ... } интерфейс) от Haskell через его FFI. В частности, у меня есть файл C ++ three.cpp; внутри это одна внешняя функция C ++, к которой я пытаюсь получить доступ из Haskell (с некоторым другим частным кодом C ++ в фоновом режиме).

Эта проблема: Я могу успешно бежать stack build а также stack test и все работает как положено. Тем не менее, когда я бегу stack ghci Я получаю следующую ошибку:

/usr/bin/ld: /home//Dropbox/Sling/.stack-work/dist/x86_64-linux/Cabal-1.24.0.0/build/Sling-exe/Sling-exe-tmp/src/three.o: relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)

Возможно необходимая информация: Соответствующая часть моего проекта .cabal Файл выглядит следующим образом:

executable Sling-exe
hs-source-dirs:      app
main-is:             Main.hs
ghc-options:         -fPIC -threaded -rtsopts -with-rtsopts=-N
cc-options:          -fPIC
extra-libraries:     stdc++
build-depends:       base
C-sources:           src/three.cpp
Include-dirs:        include
Includes:            include/three.h
Install-includes:    three.h
default-language:    Haskell2010

Обратите внимание, как я пытался включить -fPIC флаг, но не удалось. Какие-либо предложения?

3

Решение

Вопрос в том, что ВСЕ не чистый код C (то есть строгий код C ++) должен быть заключен в #ifdefs:

#ifdef __cplusplus //I wasn't surrounding pure C++ code with these headers!
extern "C" {
#endif

void foo();

#ifdef __cplusplus
}
#endif
1

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

Других решений пока нет …

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