我最近在我的Intel MacBook上安装了GHC 6.12和Haskell Platform 2010.1.0.1(使用二进制安装程序),并且最初一切正常。 编辑:我不得不从源代码安装cabal
、alex
和happy
,但在那之后,似乎一切都正常。然而,我发现如果我使用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_PATH
和DYLD_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的库吗?或者,如果失败了,有没有其他聪明的方法使链接不会出问题?