6

なぜcabal installはデフォルトで--enable-sharedフラグを使用しませんか?私は、このフラグを付けずにコンパイルすると、ファイルサイズが膨大になるということに気づいた。接続はありますか?これは、Haskellプログラムが単一の自己完結型バイナリに簡単に配備される方法に関する設計上の選択ですか?Haskell Staticと展開時の動的リンク

+1

ISTR共有ライブラリのサポートはかなり新しく、すべてのプラットフォームで動作しません。また、実行可能ファイルを配布するのが難しくなります。そしてスペースは安いので、誰が気にしますか?しかし、良い答えがあります。 – luqui

+1

@luqui:スペースは安いかもしれませんが、帯域幅はどうですか? 20MBのプログラムのアップデートをインターネット経由でプッシュする必要があり、クライアントの接続が理想的でない場合はどうでしょうか? –

+0

も参照してください[GHCドキュメント "共有ライブラリを使用して"](http://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/using-shared-libs.html) – mb21

答えて

4

私はそれがサポートの欠如と関係があると思います。しかし、GHCが現在ダイナミックリンクをサポートしているかどうかについては、私はまっすぐな答えを得ることはできません。 GHC wikiページSharedLibraries/PlatformSupportは2歳です。 Windowsでは

、私はそれがURLから30秒ごとにダウンロードするhttp-enumeratorを使用して書いた簡単なプログラムを含む、--enable-sharedとパッケージの全体の束を構築してみました。プログラムを実行したとき(私のプログラムでフォルダ内にすべてのDLLを置いた後)、それは数秒後にsegfaultされました。 --threadedでコンパイルすると、すぐにセグメンテーションが行われました。

これをGHC 7.0.3で試しました。 documentation page for that versionさんの言葉:

現時点では、HaskellライブラリをDLLにすることはできません。将来この機能を再開したいと考えています(4.12項「共有ライブラリの使用」を参照)。 ...

この通知は、それ以降のバージョンでは表示されません。


ところで、コードサイズ以外にも静的なバイナリには別の手間があります。 GHCは、その大きな整数のサポートにGMPを使用しています。 GMPはLGPLの下でライセンスされています。これは、独自のバイナリを配布する必要がある場合や、GPLと互換性のない依存関係(OpenSSLなど)がある場合、GMPのライセンスに準拠するようにオブジェクトファイルを配布する必要があることを意味します。どちらか、またはlibgmpを動的にリンクさせる方法を見つけてください。私はそれをする方法を知りたいです。

+1

この答えを行います2015年3月現在も保持されていますか? –

関連する問題