2017-04-21 11 views
1

Cライブラリの関数を呼び出すための簡単なコードを書きました。コードはコンパイルされます(そして同様の部分は標準のCライブラリで動作しますが、コンパイルしてリンクするとghcはCライブラリを見つけることができません)。私の秘密結社のファイルは、次のとおりです。Cライブラリがありません:

executable ttclient 
main-is: MainFFI4TT.hs 
build-depends: base 
default-language: Haskell2010 
hs-source-dirs: src 
other-modules: 
Include-dirs: treetaggerSourceC 
Includes: tagger-api.h 
extra-libraries: libtreetagger 
extra-lib-dirs: /usr/lib 

libtreetagger.so/usr/libであるが、見つからないファイル。他に何が必要なのでしょうか? stack buildまたはcabal install(8.0.2または8.0.1)のどちらを使用しても差はありません。 cabalはバージョン1.24.0.0で、システムはlinux debian stretchです。

システムディレクトリではなくユーザディレクトリにライブラリを保存することをお勧めします。これは達成できますか?

Haskellのコードは次のとおりです。私は、エラーメッセージ取得している

foreign import ccall "tagger-api.h init_treetagger"  
    c_initTreeTagger :: CString -> IO() 
    -- void init_treetagger(char *param_file_name); 

mainFFItest :: IO() 
mainFFItest = do 

    c_initTreeTagger "german-utf8.par" 

答えて

5

前提としています。その場合は

* Missing C library: libtreetagger 

を、おそらく問題はextra-librarieslib接頭辞なしのライブラリをリストすべきであるということです。

extra-libraries: treetagger 
+0

ありがとうございました!これは本当にばかげたエラーです - しかし、私はこの文書に書かれている何も見ませんでしたか?誰かがヒントを追加してください!私はFFIの2つのwikiエントリを試してみますが、おそらくFFIの経験が豊富な人がこれを行うべきです! – user855443

+0

@ user855443ハスケル特有のものではありません。 'libfoo.so' /' libfoo.a'ライブラリへのリンクは、常に 'foo'を名前として使用して行われます(C言語の' -lfoo'など)。 – ephemient

関連する問題