良い(あなたの現地時間)、みんな。GHCiでFFIコードをテストする(外国からの輸入を伴う)
外国機能インターフェイスのReal World Haskell's chapter、 を経由し、フォローアップの読書hereを行った。私は現在、Cの関数に というバインディングを試しています。いくつかのことについていくつか説明したいと思います。
次はかなり明確である:
foreign import ccall unsafe "math.h sin" c_sin :: CDouble -> CDouble
私はこれをロードし、GHCiの中でそれを使用するコード、およびすべてが正常であることができます。それは でさえ、emacsのHaskellモードで埋め込まれたghciに読み込まれます。私はテストのためにこれが素晴らしいことがわかります。 math
はシステムライブラリですので、これは簡単です。今
実世界ハスケルからの例:私は目的関数のシグネチャの残りの部分を残してきた
foreign import ccall unsafe "pcre.h pcre_compile" c_pcre_compile :: ...
。今、私はこれをロードできません ハスケルモード。私はその後、私のバインディングコードとテストをロードすることができ
GHCi, version 7.6.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading object (dynamic) /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../lib/libpcre.so ... done
final link ... done
:
私はghci -lpcre
を、そして物事が正しくロードされているインスタント確認を得る:私が見てきたすべての例では、これが行われなければならないと言います離れていても...
質問1_ pcreのようにghci内から非システムライブラリを読み込むことはできますか?これは 私がemacs内でテストできるようになります。
移動します。 私は自身のコードにバインディングを書き込もうとすると、もっと複雑になります。
foreign import ccall unsafe "myprint.h myprint" c_myprint :: CString -> IO()
間違いなく無意味な機能です。私が実行して、これをコンパイルすることができました
{-# LANGUAGE ForeignFunctionInterface #-}
-- printTest.hs
import Foreign
import Foreign.C.Types
import Foreign.C.String
import qualified Data.ByteString.Char8 as B
---
foreign import ccall unsafe "myprint.h myprint" c_myprint :: CString -> IO()
---
main = B.useAsCString (B.pack "Tempura is great!") c_myprint
:C.ここで簡単なテストファイルであると、それはHaskellのから延ByteStringと 版画それを取る
ghc --make myprint.c printTest.hs
と実行を得るが、私はghciでロードできませんでした。 これはテストプロセスに深刻な差があります。私は私の Cコードと結合するGHCiの中にHaskellコードをロードするためにしなければならない何
_Question 2_? FFI情報の主要な情報源はこれについて何も言及していませんでした。 ghci -L
で手品をすることはできません。
ご支援いただければ幸いです。
Q2の場合、myprint.cをghciでロードしたい場合は、ライブラリとしてコンパイルする必要があります。これはcコンパイラ/ OS依存です。 – Jonke
これらの行に沿って(gcc -c -fPIC foo.c -o foo.oとgcc -shared -Wl、-soname、libfoo.so.1 -o libfoo.so.1.0.1 foo.oなど)その – Jonke