【问题标题】:Do ghc-compiled binaries require GHC or are they self-contained?ghc 编译的二进制文件是否需要 GHC 或者它们是独立的?
【发布时间】:2011-09-17 09:52:23
【问题描述】:

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

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

【问题讨论】:

标签: haskell linker binary executable


【解决方案1】:

GHC 确实会生成不需要安装 GHC 本身的独立二进制文件,但是它们确实链接到一些动态库,最显着的是 libgmp。其余的库通常在大多数 Linux 系统上都是开箱即用的。我相信 Windows 上的情况也类似。

您可以在 Linux 上使用 ldd 检查您依赖的动态库。这是我在 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)

【讨论】:

  • ldd 应该也适用于 Mac OS X,在 Windows 上,您可以使用 Dependency Walker 获取相同的信息。
  • @Daniel Pryden:ldd 不在 OS X 上,但您可以使用 otool -L 获取类似信息。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果希望将一些 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
    

    虽然libffilibz 很常见,但它们并不普遍(libffi 是我经常在我的 Haskell 二进制文件中看到的一种)。

    这种方法是最近在haskell-cafe 上首次向我建议的。

    【讨论】:

    • 对不起,我之前给出这个答案时出错了——我一直在构建环境中进行测试,我已经将一些.a 文件复制到 GHC 的 libdir 中。重要的是,所有库前面也有 -optl,如上面(现在已修改)示例中所示,否则 GHC 会根据链接器选项对它们重新排序。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 2021-08-13
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多