ghc编译的二进制文件是否需要GHC还是独立的?
如果一个朋友想运行我的Haskell二进制文件,他是否必须首先安装Haskell,或者他能立即运行二进制文件?
Mac,Windows和Linux上的答案是一样的吗?
GHC确实会生成不需要安装GHC的独立二进制文件,但是它们可以链接到一些dynamic库,最值得注意的是libgmp
。 在大多数Linux系统上,通常可以find其余的库。 我相信在Windows上的情况是相似的。
您可以在Linux上使用ldd
来检查依赖哪个dynamic库。 下面是我在Ubuntu Natty上获得的一个简单的Hello World程序:
$ 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)
GHC用链接的运行时将Haskell编译成目标代码。 这意味着你不需要安装Haskell编译器来执行Haskell程序。
生成的可执行文件将使用静态和dynamic链接的一些变体,用于C和Haskell库依赖项。 任何静态链接的东西都不需要安装在用户的机器上。 任何dynamic链接都必须安装。
为了在Linux(或者Cygwin)上看到你需要运行的可执行文件,使用ldd
。 您可以通过静态传递给GHC来强制几乎所有的静态链接。
如果希望将一些C库与Haskell可执行文件静态链接,那么在Linux上可以使用GNU链接器--whole-archive
; 例如:
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。 一些(例如xmonad)使用Haskell作为它们的configuration语言; 在这种情况下,你将需要一个编译器。
还有一个静态和dynamic链接的问题。 我相信现在的默认状态仍然是静态链接,在这种情况下,将二进制文件从一台机器迁移到另一台机器应该非常容易(只需要具有相同的体系结构和操作系统)。