友人がHaskellバイナリを実行したい場合は、まずHaskellをインストールする必要がありますか、またはバイナリをすぐに実行できますか?ghcコンパイルされたバイナリにはGHCが必要ですか、それとも自己完結型ですか?
答えはMac、Windows、Linuxで同じですか?
友人がHaskellバイナリを実行したい場合は、まずHaskellをインストールする必要がありますか、またはバイナリをすぐに実行できますか?ghcコンパイルされたバイナリにはGHCが必要ですか、それとも自己完結型ですか?
答えはMac、Windows、Linuxで同じですか?
GHCは、GHC自体をインストールする必要のないスタンドアロンバイナリを生成しますが、いくつかのダイナミックライブラリ、特にlibgmp
とリンクします。残りのライブラリは、ほとんどのLinuxシステムでは一般的に使用されています。私は状況がWindows上で似ていると信じています。
Linux上でldd
を使用して依存しているダイナミックライブラリを確認することができます。ここで私は、単純なHello WorldのプログラムのためのUbuntuナッティに乗るものです:
$ echo 'main = putStrLn "Hello World"' > Hello.hs
$ ghc --make Hello.hs
[1 of 1] Compiling Main (Hello.hs, Hello.o)
Linking Hello ...
$ ldd Hello
linux-vdso.so.1 => (0x00007fffe45ff000)
libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007f8874cf9000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8874a74000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f887486b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8874667000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88742d3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f88740b4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8874f7a000)
'ldd'はMac OS Xでも動作するはずです.Windowsでは[Dependency Walker](http ://www.dependencywalker.com/)と同じ情報を取得します。 –
@Daniel Pryden: 'ldd'はOS Xにはありませんが、' otool -L'を使って同様の情報を得ることができます。 – mipadi
ほとんどのバイナリでGHCのインストールは必要ありません。一部の人(例えば、xmonad)は、設定言語としてHaskellを使用します。そのような場合はコンパイラが必要になります。
静的リンクと動的リンクの問題もあります。私は今のところデフォルトはまだ静的なリンクであると信じています。その場合、バイナリをあるマシンから別のマシンに移行するのは簡単です(同じアーキテクチャとOSを持つだけです)。
GHCは、リンクされた実行時に、オブジェクトコードするHaskellのをコンパイルします。つまり、Haskellプログラムを実行するためにHaskellコンパイラをインストールする必要はありません。
生成された実行可能ファイルは、CおよびHaskellライブラリの依存関係の両方に対して、静的および動的リンクのいくつかの変形を使用します。静的にリンクされているものは、ユーザーのマシンにインストールする必要はありません。動的にリンクされているものはすべてインストールする必要があります。
Linux(またはCygwin)で実行可能ファイルと一緒に出荷する必要があるものを確認するには、ldd
を使用してください。 GHCに-static
を渡すことによって、ほとんどすべての静的リンクを強制することができます。
いくつかのCライブラリをHaskell実行ファイルに静的にリンクさせることが望ましい場合は、Linuxでは--whole-archive
をGNUリンカーで使用できます。例えば:
ghc --make HelloZ.hs \
-optl-Wl,--whole-archive \
-optl/usr/lib/x86_64-linux-gnu/libffi.a \
-optl/usr/lib/x86_64-linux-gnu/libz.a \
-optl-Wl,--no-whole-archive
彼らは非常に共通しているものの、libffi
とlibz
は(libffi
が、私はしばしば私のHaskellのバイナリで見るものです)ユビキタスではありません。
このアプローチは、まさに最近、haskell-cafeに私に示唆されました。
申し訳ありませんが、この回答を早く与えたときにエラーが発生しました.GHCのlibdirにいくつかの '.a'ファイルをコピーしたビルド環境でテストしていました。上の(今修正された)例で与えられているように、すべてのライブラリもその前に '-optl'を持っていることが重要です。さもなければ、GHCはそれらをリンカオプションに関して並べ替えます。 – solidsnack
ダイナミックリンクに関するこれまでの回答も参照してください。http://stackoverflow.com/questions/6115459/small-haskell-program-コンパイル--with-ghc-into-huge-binary –
静的リンクでは、http: /stackoverflow.com/questions/5131182/how-to-compile-haskell-to-a-static-library –