2016-11-05 14 views
7

mainがC/C++にあるC/C++プロジェクトで、stackビルドツールを使用してHaskellライブラリ(Hackageからのパッケージのインポートなど)を使用するとします。あなたのプロジェクトは(hackageから外部のライブラリを使用する)Lib.hsと命名されたと仮定するとHaskellのスタックビルドツールを使用してC/C++で使用するライブラリをエクスポートする方法

、あなたのLib.oLib.hiをエクスポートするために、スタックを使用する方法があり、かつgccまたはg++のようなC/C++コンパイラによって消費されるLib_stub.h

EDIT:関連する質問があるかもしれない:「どのように1はmainがC/Cに配置されているハスケル& C/C++プロジェクト++

で使用するビルド・ツールとしてスタックを使用することができますか? EDIT2:この問題を解決する方法の1つは、いつものようにStackを使うことですが、C/C++のメイン関数をHaskellに移行するのが最も良い方法ですか?

+0

"この問題を解決する方法の1つは、いつものようにStackを使うことですが、C/C++のmain関数をHaskellに移行することです。" - これは非常に最適ではないようです。私はこの可能性が元の質問をあまり関連性のないものにするとは思わない。 – duplode

+0

パフォーマンスの意味で準最適? – George

+0

"パフォーマンスの面で最適以下ですか?" - その意味で、私は真に知らない。私はちょうどプロジェクトの組織の面で最適以下を意味しました。 – duplode

答えて

4

スタックは実際にこれを行うことはできません。

Cabalに「外国の図書館」を追加するというサポートがありますが、まだリリース版ではありません。コミット参照382143これは、使用された各Haskellパッケージの動的バージョンと動的にリンクする共有ライブラリを生成します。

あなたのパッケージをスタックでビルドすることができます。そして、事実の後に、単一のネイティブライブラリをアセンブルすることができます。 Galuaプロジェクトでは、カスタムと別のlinking scriptでこれを行います。

このリンクプロセスの結果、Cプロジェクトに含めるのに適したスタンドアロンの静的リンクライブラリが得られます。libgalua.a

共有ライブラリにリンクするのに適したスタンドアロンライブラリを作成するために、GHCを再コンパイルしてPIC静的ライブラリを生成する必要があることに注意してください(macOSはこれをデフォルトで行います)。

+0

GHCを再コンパイルするだけで、Linux上で動作するようになるのはかなり難しいようです。 C + +プロジェクトをStackプロジェクト(HaskellにあるMainを持つ)に強制的に移行することについての考えはありますか?これが発生する本質的なパフォーマンスヒットや、私が気づくべき他の問題はありますか? – George

+0

おそらく、GHCを使ってすべてのhaskellファイルを手作業でコンパイルするより良い方法かもしれません(アップストリームのHackageからダウンロードしたライブラリ、つまり自分でダウンロードして 'Makefile'に追加する必要があります)。これは、結局のところ、typicall C++プロジェクトが独自のファイルでどのように構成されているかということです。 C++プロジェクトの中でHaskellにこのプラクティスを拡張してみませんか? – George

+0

基本的に、Galuaプロジェクトでの経験は、ここでのベストプラクティスのヒントですか?あるいは、PICのサポートを受けてGHCを再コンパイルし、スタックを使って 'libgalua.a'を出力するというアプローチで満足していますか? – George

関連する問題