【问题标题】:Haskell ghc compiling/linking error, not creating executable. (linux)Haskell ghc 编译/链接错误,未创建可执行文件。 (Linux)
【发布时间】:2012-10-14 07:43:55
【问题描述】:

我在 haskel 中编写了一个基本的 hello world 程序并尝试编译它: ghc 文件名.hs。它生成 .hi 和 .o 文件,但没有可执行文件并显示 链接器中的此错误:

marox@IT-marox:~/Marox$ ghc tupel.hs
链接元组 ...
/usr/bin/ld: --hash-size=31: 未知选项
/usr/bin/ld:使用 --help 选项获取使用信息
collect2: ld 返回 1 个退出状态

谷歌搜索没有返回任何有用的信息。

我在 ubuntu 12.04 上。

我该如何解决这个问题?

【问题讨论】:

    标签: linux haskell compilation linker ghc


    【解决方案1】:

    您安装了binutils-gold 吗?如果是,这就是问题所在(因为gold linker 不支持--hash-size AFAIK)。

    可能的解决方案:

    1. 去除黄金
    2. 您的ld 可能链接到ld.gold,因此将符号链接更改为ld.ld
    3. 通过-pgml 选项明确告诉haskell 编译器使用哪个链接器:ghc -pgml ld.ld tupel.hs
    4. 从源代码安装ghc,因为ghc 的配置脚本将构建ghc,因此它不会使用--hash-size
    5. 根据您的ghc 版本,您可以在ghc 的设置文件/usr/lib/ghc-your.ghc.version/settings 中调整链接器设置

    【讨论】:

    • 移除黄金。做了第2步,得到了这个:“ghc:无法执行:ld.ld”
    • 我并不是要应用上述所有项,只是其中一项 :-) 如果您移除了黄金,那么一切应该美好的。只需确保/usr/bin/ld 确实存在,如果它是符号链接,它必须指向 GNU ld。当您安装黄金时,它会将ld 移动到ld.ld,安装ld.gold,然后将ld 链接到ld.gold (AFAIK)。希望现在更清楚了。
    • ghc -pgml ld 将不起作用。根据 dcoutts 的说法,-pgml 的参数必须是 gcc 或类似的东西。必须通过使用 -optl 将参数传递给 pgml 来更改链接器。
    • 如果您想使用黄金并解决--hash-size=31: unknown option,请参阅stackoverflow.com/a/16105691/263061
    • GHC has now official support to use gold for linking 并且在被告知使用黄金时不会传递有问题的--hash-size 标志。
    【解决方案2】:

    更新 - Ubuntu 12.10 上的 gold 似乎将 GNU ld 移至 ld.bfd。为了解决这个问题,我按照建议删除了 ld 链接并用

    重新制作了链接
      ln -s ld.bfd ld
    

    ghc 编译正在进行中。

    (看不到如何破坏 usr/lib/ghc 中的设置文件,因为该条目用于 gcc,它通过其命令行传递给 ld,尽管这将是我的首选选项,以防其他需要 ld保持原来的样子。)

    感谢 Dominic 提供的查找位置指针!快把我逼疯了……

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2011-03-02
      • 2012-09-28
      • 1970-01-01
      • 2013-09-24
      • 2012-05-08
      相关资源
      最近更新 更多