2016-10-19 11 views
3

私がやろうとしていることは HaskellからFFI経由でC++(extern "C" { ... }インターフェイス経由)を呼び出そうとしています。特に、私はC++ファイルthree.cppを持っています。その中にはHaskellからアクセスしようとしているC++の関数があります(バックグラウンドでは他のいくつかの非公開のC++コードがあります)。HaskellからC++を呼び出すときに `stack ghci`を実行する際に問題が発生しました。

問題:stack buildstack 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フラグですが失敗しました。助言がありますか?

答えて

1

問題は、非純粋なCコード(すなわち、厳密なC++コード)ALLが#ifdefsに囲まなければならないことが判明:

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

void foo(); 

#ifdef __cplusplus 
} 
#endif 
関連する問題