これはおそらくこの投稿の複製です。しかし、それが得た唯一の答えは私にはうまくいかないようです. 私はLinux Ubuntu Trustyを使用しています。
/usr/local/lib (LD_LIBRARY_PATH に含まれています) に独自の C ライブラリ libMyLib.so があります。
この C ライブラリへの haskell バインディングを通常の方法で書きました。Main.hs :
{-# LANGUAGE ForeignFunctionInterface #-}
module Main where
import Foreign
import Foreign.C.Types
foreign import ccall safe "mycfunction" c_myCfunction :: CInt -> IO (CInt)
-- etc...
main = do -- ...
このプログラムを ghci でテストし、ライブラリとそれを見つけることができるディレクトリを渡しますghci /usr/local/lib/ -lMyLib
。問題なく動作します。
今、独立してスタックの使用を開始しようとしています。このガイドに従って、重要なプログラムの例をいくつか構築することができました。
ただし、上記の FFI Main.hs プログラムをスタックビルドできません。これは、C ライブラリが見つからないというエラーが表示されるためです。
初挑戦 :
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
2 回目の試行の前に、次を追加しました:
- extra-lib-dirs: [/usr/local/lib]
stack.yaml ファイルに追加しました。
- extra-include-dirs: [/usr/local/lib]
stack.yaml ファイルに追加されました (ただし、おそらく必要ありません)。-実行可能ファイルまたはライブラリのラベルの下にあるプロジェクトの cabal ファイルに
追加されました (私も同じ結果を試しました)。 extra-libraries: lMyLib
extra-libraries: libMyLib.so
2回目の試行:
me@user:~/myProject$ stack build
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
これで、必要な C ライブラリがわかりました。これは、適切な余分なライブラリ ディレクトリが追加されている間 (エラー メッセージの最後を参照)、それについて不平を言ったからです。コメント(you may need the "-dev" version)
がここに関連しているかどうかはわかりません。
私の質問:ここで立ち往生しています。stack build
Cライブラリを見つけるために、yamlまたはcabalファイル、または他の場所に対して他に行うべきことはありますか?