2017-04-21 67 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