2017-04-21 70 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-libraries應該列出庫沒有lib前綴:

extra-libraries: treetagger 
+0

非常感謝!這是一個非常愚蠢的錯誤 - 但我沒有看到文檔中提到的任何內容?有人可以請添加一個提示!我將嘗試用於FFI的兩個wiki條目 - 但也許有人有更多的FFI經驗應該這樣做! – user855443

+0

@ user855443它不是Haskell特有的。鏈接到'libfoo.so' /'libfoo.a'庫總是使用'foo'作爲名稱(例如C中的'-lfoo')。 – ephemient