ghc编译的二进制文件是否需要GHC或它们是独立的吗?

mca*_*dre 45 binary linker executable haskell

如果朋友想要运行我的Haskell二进制文件,他是否必须先安装Haskell,还是可以立即自行运行二进制文件?

答案在Mac,Windows和Linux上是否相同?

ham*_*mar 44

GHC确实生成了不需要安装GHC本身的独立二进制文件,但是它们确实与某些动态库相关联libgmp.其余的库通常在大多数Linux系统上都是开箱即用的.我相信Windows的情况类似.

您可以ldd在Linux 上检查您依赖的动态库.这是我在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)
Run Code Online (Sandbox Code Playgroud)

  • @Daniel Pryden:`ldd`不在OS X上,但你可以使用`otool -L`来获取类似的信息. (10认同)
  • `ldd`也适用于Mac OS X,在Windows上,您可以使用[Dependency Walker](http://www.dependencywalker.com/)获取相同的信息. (2认同)

Don*_*art 24

GHC使用链接的运行时将Haskell编译为目标代码.这意味着您不需要安装Haskell编译器来执行Haskell程序.

生成的可执行文件将使用一些静态和动态链接的变体,用于C和Haskell库依赖项.静态链接的任何内容都不需要安装在用户的计算机上.必须安装任何动态链接的东西.

要在Linux(或Cygwin)上查看您需要随可执行文件一起提供的内容,请使用ldd.您可以通过传递-static给GHC 来强制几乎所有内容的静态链接.


sol*_*ack 12

如果希望将一些C库与Haskell可执行文件静态链接,那么在Linux上可以使用--whole-archiveGNU链接器; 例如:

  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
Run Code Online (Sandbox Code Playgroud)

虽然它们非常普遍,libffi并且libz无处不在(libffi我经常在我的Haskell二进制文件中看到它).

最近在haskell-cafe上向我提出了这种方法.


Dan*_*ner 5

大多数二进制文件不需要安装GHC.一些(例如xmonad)使用Haskell作为其配置语言; 在这些情况下,您将需要一个编译器.

还存在静态与动态链接的问题.我相信现在的默认值仍然是静态链接,在这种情况下,将二进制文件从一台机器迁移到另一台机器应该非常容易(只需要具有相同的架构和操作系统).