2013-07-23 16 views
15

Haskellで書かれたライブラリをバックエンドとして使用するQtC++)のアプリケーションをビルドします。 HaskellライブラリのインターフェイスをC++にエクスポートするにはどうすればよいですか?C++からHaskellライブラリを呼び出す

haskellライブラリの関数がintfloatのような単純な型を使用している場合、構造体を引数として使用するとどうなりますか?この場合、最もスケーラブルなソリューションは何ですか?

+1

[UNIXドメインソケット](https://en.wikipedia.org/wiki/Unix_domain_socket)でIPCを行うのはどうですか? –

+1

IPCは両方の面でマーシャリングが必要です。それはある種の解決策ですが、依然として多くの作業が必要であり、効率的ではありません。 – remdezx

+1

私はそれを試していませんでしたが、それはあなたの役に立つかもしれません:https://github.com/wavewave/fficxx – Yuras

答えて

3

これらのデータ構造をHaskellで使用できるものにマーシャリングするには、haskellコードを記述する必要があります。 c2hsツールは、この点で非常に有用である:http://hackage.haskell.org/package/c2hs

ハスケルからCを呼び出すために設計されるを思わツールは、それもある意味では逆に非常に有用であるが - それはマーシャル複雑なCにあなたを可能に型をHaskell型に変換します。あなたが公開している関数はC型(通常は複雑な構造体へのポインタ)を取る必要があるので、A)適切なC構造体を構築し、B)c2hsが提供する機能を使用して、それらの構造体をHaskellにマーシャルするあなたと一緒に作業することができます。

また、c2hsスタイルで生成されたツールでは、すべてをマーシャリングする必要はありません。実際に気にしているCデータ構造の部分を調べるためのアクセサを生成するだけでよいのです。

+2

実際には、C++コードからhaskell関数を呼び出すためのCヘッダ/ラップを生成したいと考えています。 C++コードのhaskellバインディングを記述しないでください。私はあなたがその逆を読んだと思う。 –

+0

それは本当です、私はC + +からhaskellコードを呼び出す必要があります。 – remdezx

+0

remdezx:私の編集を参照してください – sclv

2
パーティに後期

、私はあなたがこれを使用したいと思う:foreign export ccall foo :: Int -> IO Intよう

具体的に何かを。

詳細については、リンクを参照してください(C++プログラムへの統合方法など)。

+1

この回答は、OPが何をするかを知っているとは何も加えていません。特に、複雑な構造の扱い方については説明していません。 – bmaderbacher

関連する問題