GHC 6.12 and MacPorts

7

我最近在我的Intel MacBook上安装了GHC 6.12和Haskell Platform 2010.1.0.1(使用二进制安装程序),并且最初一切正常。 编辑:我不得不从源代码安装cabalalexhappy,但在那之后,似乎一切都正常。然而,我发现如果我使用cabal install来安装一个依赖于MacPorts库的软件包(例如cabal install --extra-lib-dirs=/opt/local/lib --extra-include-dirs=/opt/local/include gd),在GHCi中运行正常,但如果我尝试编译,就会出现错误。

Linking test ...
Undefined symbols:
  "_iconv_close", referenced from:
      _hs_iconv_close in libHSbase-4.2.0.0.a(iconv.o)
  "_iconv", referenced from:
      _hs_iconv in libHSbase-4.2.0.0.a(iconv.o)
  "_iconv_open", referenced from:
      _hs_iconv_open in libHSbase-4.2.0.0.a(iconv.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status

经过一番搜索,我找到了一个长长的Haskell-cafe线程,讨论了这个问题。结论似乎是MacPorts安装了更新版本的libiconv,而二进制接口与系统自带的版本略有不同。因此,如果您尝试链接任何MacPorts库,MacPorts libiconv也会被链接;而由于基本库是构建在对不同版本的libiconv进行链接的基础上的,所以会出现问题。我已经尝试过设置LD_LIBRARY_PATHDYLD_LIBRARY_PATH,并添加了更多的标志来尝试让它再次查看/usr/lib(例如:cabal install --extra-lib-dirs=/opt/local/lib --extra-include-dirs=/opt/local/include --extra-lib-dirs=/usr/lib --extra-include-dirs=/usr/include gd),但都没有成功。卸载MacPorts libiconv并不是一个真正的选择,因为我安装了很多依赖于它的端口,包括一些我想让Haskell链接的端口,比如gd2

从我在网上看到的情况来看,问题似乎真的很严重:“你完了”,在使用GHC编译时,你不能链接任何MacPorts库,而且似乎没有解决方案。然而,那个帖子是在2009年末发布的,所以我认为有机会有人找到了解决方案、解决方法或者荒谬的hack……任何东西都行。因此:有人知道如何让GHC 6.12同时链接系统libiconv和来自MacPorts的库吗?或者,如果失败了,有没有其他聪明的方法使链接不会出问题?


你安装了二进制的Haskell平台,还是MacPorts构建?或者源代码构建? - Don Stewart
GHC和Haskell平台的二进制安装程序。我会编辑问题以反映这一点。 - Antal Spector-Zabusky
我正在使用从源代码构建的 GHC 6.12.3 遇到了完全相同的问题。 - Simon Michael
6个回答

9

当我安装haskell-platform-2010.1.0.1-i386并尝试编译Haskell程序时,我在MacOSX 10.5.8上遇到了相同的错误。我的解决方案是在编译程序时向ghc添加选项“-L/usr/lib”。我相信这使得链接器首先在/usr/lib中搜索iconv库,为我解决了问题。


1
我本以为我已经尝试过这个了,但今天在使用GTK编译某些东西并且遇到相同的错误时,我想我可以试一试。结果居然成功了!谢谢! - Antal Spector-Zabusky
1
当使用 cabal 安装东西时,你如何完成这个任务? - Simon Michael
5
在我的~/.cabal/config文件中加入"extra-lib-dirs: /usr/lib"就解决了这个问题。 - Simon Michael

1

我有点羞于承认,但我用以下咒语取得了一些成功:

LIBRARY_PATH=/usr/lib:/opt/local/lib cabal install --ghc-option="-L/usr/lib" SDL-gfx

1
我通过卸载MacPorts解决了我的问题。您可能只需卸载依赖于它的libiconv的MacPorts版本和任何库即可轻松解决问题。

1
这对我也起作用了。HomeBrew似乎是MacPorts的一个很好的替代品。 - Sjoerd Visscher

1
我修复了:
stack build --ghc-options "-L/usr/lib"

0

2
那个错误提示表明cabal不工作——至少对我来说,GHC和GHCi运行良好。我不得不从源代码安装cabalalexhappy;一旦我这样做了,一切都正常(除了这个libiconv错误)。不过你发现得很好。 - Antal Spector-Zabusky

0
也许这样会更好: cabal configure --extra-lib-dir=/usr/lib 它可以解决在OSX Mountain Lion上的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接