Что я пытаюсь сделать: Я пытаюсь вызвать 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
флаг, но не удалось. Какие-либо предложения?
Вопрос в том, что ВСЕ не чистый код C (то есть строгий код C ++) должен быть заключен в #ifdefs:
#ifdef __cplusplus //I wasn't surrounding pure C++ code with these headers!
extern "C" {
#endif
void foo();
#ifdef __cplusplus
}
#endif
Других решений пока нет …