2016-01-10 16 views
9

これはおそらくthis postの複製です。しかし、それが得た唯一の答えは私のためには機能していないようですので、私はここに自分の事例を載せて、特定の解決策を見つけることを望んでいます。私はLinux Ubuntu Trustyにいる。HaskellのスタックとCライブラリ

私は/ usr/local/lib(LD_LIBRARY_PATHに含まれています)にある独自のCライブラリlibMyLib.soを持っています。

私はこのCライブラリへのuskalバインディングを書いています。 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をし、それだけで正常に動作します。

今、私はスタックを使い始めようとしていますが、それに続いてthis guideいくつかの重要なプログラム例を構築することができました。

最初の試み:
[email protected]:~/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 

しかし、私はそれが欠けているCライブラリ文句として上FFI Main.hsプログラムをスタック構築することはできませんよ2回目の試行で、私は以下を追加しました:
- extra-lib-dirs: [/usr/local/lib]をstack.yamlファイルに追加しました。
- extra-include-dirs: [/usr/local/lib]をstack.yamlファイルに追加しました(ただし、おそらく必要ありません)。
- extra-libraries: lMyLibをプロジェクトのカバールファイルのラベルの実行可能ファイルまたはライブラリの下に追加しました(私もextra-libraries: libMyLib.soと同じ結果を試しました)。

2回目の試行:
[email protected]:~/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ファイル、または他の場所に何かすべきことがありますか?

+1

私はそれが 'extra-libraries:MyLib'であるべきだと思います。 –

+1

@Reid Barton。それはうまくいった!今、私は醜い '/usr/local/lib/libMyLib.so.2:シンボルを追加する際にエラー:コマンド行からDSOが見つかりませんでした。 'というメッセージが表示されますが、それは別に扱わなければならないオリジナルの投稿とは独立した問題です。あなたの答えを投稿してください、私はそれを受け入れるでしょう。ありがとう! – Janthelme

答えて

4

extra-librariesは、基本ライブラリ名のみを持つ必要がありますので、extra-libraries: MyLibを使用してください。

関連する問題