Haskell Stack和C库

时间:2016-01-10 02:40:29

标签: haskell ffi haskell-stack

这可能是this post的副本。但它得到的唯一答案对我来说似乎不起作用,所以我在这里发布自己的案例,希望找到一个具体的解决方案。我在Linux Ubuntu Trusty上。

我有一个专有的C库libMyLib.so,位于/ usr / local / lib(包含在LD_LIBRARY_PATH中)。

我以这种方式用这个C库编写了haskell绑定。 Main.hs:

\r\n

我可以用ghci来测试这个程序,将它传递给它和它可以找到它的目录:{-# LANGUAGE ForeignFunctionInterface #-} module Main where import Foreign import Foreign.C.Types foreign import ccall safe "mycfunction" c_myCfunction :: CInt -> IO (CInt) -- etc... main = do -- ... 它运行得很好。

现在,独立地,我正在尝试开始使用堆栈,并且在this guide之后,我能够构建几个非平凡的程序示例。

但是,我无法堆叠构建上面的FFI Main.hs程序,因为它抱怨缺少C库:

首先尝试:
ghci /usr/local/lib/ -lMyLib

me@user:~/myProject$ stack build

在第二次尝试之前,我确实添加了以下内容:
- 将myProject-0.1.0.0: configure Configuring myProject-0.1.0.0... myProject-0.1.0.0: build Preprocessing library myProject-0.1.0.0... In-place registering myProject-0.1.0.0... Preprocessing executable 'myProject-exe' for myProject-0.1.0.0... Linking .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/myProject-exe/myProject-exe ... .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/myProject-exe/myProject-exe-tmp/MyModule.o: In function `c8QI_info': (.text+0x102b): undefined reference to `MyModule_mycfunction' collect2: error: ld returned 1 exit status -- While building package myProject-0.1.0.0 using: /home/me/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.5.0-ghc-7.10.3 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.5.0 build lib:myProject exe:myProject-exe --ghc-options " -ddump-hi -ddump-to-file" Process exited with code: ExitFailure 1 添加到stack.yaml文件中 - 将extra-lib-dirs: [/usr/local/lib]添加到stack.yaml文件中(尽管可能不需要) - 在标签可执行文件或库下的项目cabal文件中添加了extra-include-dirs: [/usr/local/lib](我也尝试了extra-libraries: lMyLib,结果相同)。

第二次尝试:
extra-libraries: libMyLib.so

me@user:~/myProject$ stack build

所以现在它知道它需要哪个C库,因为它抱怨它,同时添加了正确的额外库目录(参见错误消息的最后)。我不确定评论myProject-0.1.0.0: configure Configuring myProject-0.1.0.0... setup-Simple-Cabal-1.22.5.0-ghc-7.10.3: Missing dependency on a foreign library: * Missing C library: lMyLib This problem can usually be solved by installing the system package that provides this library (you may need the "-dev" version). If the library is already installed but in a non-standard location then you can use the flags --extra-include-dirs= and --extra-lib-dirs= to specify where it is. -- While building package myProject-0.1.0.0 using: /home/me/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.5.0-ghc-7.10.3 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.5.0 configure --with-ghc=/home/me/.stack/programs/x86_64-linux/ghc-7.10.3/bin/ghc --with-ghc-pkg=/home/me/.stack/programs/x86_64-linux/ghc-7.10.3/bin/ghc-pkg --user --package-db=clear --package-db=global --package-db=/home/me/.stack/snapshots/x86_64-linux/lts-4.0/7.10.3/pkgdb --package-db=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/pkgdb --libdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/lib --bindir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/bin --datadir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/share --libexecdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/libexec --sysconfdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/etc --docdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/doc/myProject-0.1.0.0 --htmldir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/doc/myProject-0.1.0.0 --haddockdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/doc/myProject-0.1.0.0 --dependency=base=base-4.8.2.0-0d6d1084fbc041e1cded9228e80e264d --dependency=bytestring=bytestring-0.10.6.0-9a873bcf33d6ce2fd2698ce69e2c1c66 --dependency=safe=safe-0.3.9-e3aa437cf6afe091d2ac3ab91bc10ddd --dependency=split=split-0.2.2-10f39ee49f650eefddf38af51b65d10a --extra-include-dirs=/usr/local/lib --extra-lib-dirs=/usr/local/lib --enable-tests --enable-benchmarks Process exited with code: ExitFailure 1 是否与此相关。

我的问题:我被困在这里。我应该对yaml或cabal文件或其他地方做任何其他事情,以便(you may need the "-dev" version)找到C库吗?

1 个答案:

答案 0 :(得分:5)

unexpected ")"应该只有基本库名称,因此请使用extra-libraries