运行Haskell代码Haskell OSX iconv时的体系结构x86_64

运行Haskell代码Haskell OSX iconv时的体系结构x86_64,haskell,Haskell,当我在我的计算机上编译一个正在工作的Haskell代码时,它抛出了架构x86_64的错误。它在我朋友的电脑上运行得很好,这台电脑的结构相同 $ ghc --make BoardMain.hs Linking BoardMain ... Undefined symbols for architecture x86_64: "_iconv", referenced from: _hs_iconv in libHSbase-4.9.1.0.a(ico

当我在我的计算机上编译一个正在工作的Haskell代码时,它抛出了架构x86_64的错误。它在我朋友的电脑上运行得很好,这台电脑的结构相同

  $ ghc --make BoardMain.hs
    Linking BoardMain ...
    Undefined symbols for architecture x86_64:
      "_iconv", referenced from:
          _hs_iconv in libHSbase-4.9.1.0.a(iconv.o)
         (maybe you meant: _hs_iconv, _base_GHCziIOziEncodingziIconv_iconvEncoding5_closure , _base_GHCziIOziEncodingziIconv_iconvEncodingzuloc_info , _base_GHCziIOziEncodingziIconv_iconvEncoding9_info , _hs_iconv_open , _base_GHCziIOziEncodingziIconv_iconvEncoding10_closure , _base_GHCziIOziEncodingziIconv_iconvEncoding11_info , _base_GHCziIOziEncodingziIconv_iconvEncoding7_closure , _base_GHCziIOziEncodingziIconv_iconvEncoding8_info , _base_GHCziIOziEncodingziIconv_iconvEncoding11_closure , _base_GHCziIOziEncodingziIconv_iconvEncoding8_closure , _base_GHCziIOziEncodingziIconv_iconvEncodingzuloc_closure , _hs_iconv_close , _base_GHCziIOziEncodingziIconv_iconvEncoding4_closure , _base_GHCziIOziEncodingziIconv_iconvEncoding10_info , _base_GHCziIOziEncodingziIconv_iconvEncoding3_closure , _base_GHCziIOziEncodingziIconv_iconvEncoding9_closure , _base_GHCziIOziEncodingziIconv_iconvEncoding2_closure , _base_GHCziIOziEncodingziIconv_iconvEncodingzuloc1_info , _base_GHCziIOziEncodingziIconv_iconvEncoding7_info , _base_GHCziIOziEncodingziIconv_iconvEncoding2_info , _base_GHCziIOziEncodingziIconv_iconvEncoding4_info , _base_GHCziIOziEncodingziIconv_iconvEncodingzuloc1_closure )
      "_iconv_close", referenced from:
          _hs_iconv_close in libHSbase-4.9.1.0.a(iconv.o)
         (maybe you meant: _hs_iconv_close)
      "_iconv_open", referenced from:
          _hs_iconv_open in libHSbase-4.9.1.0.a(iconv.o)
         (maybe you meant: _hs_iconv_open)
      "_locale_charset", referenced from:
          _localeEncoding in libHSbase-4.9.1.0.a(PrelIOUtils.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    `gcc' failed in phase `Linker'. (Exit code: 1)

错误不是由体系结构引起的。该错误是因为另一个可能与MacPorts一起安装的libiconv位于

/opt/local/lib作为/opt/local/lib/libiconv*

在编译代码时,它引用了Macports libiconv,它与OS X libiconv有些不同。我们需要机器使用OS X libiconv,以确保它使用的OS X libconv位于

/usr/libas/usr/lib/libiconv*

我们需要将额外的库方向命令传递给阴谋集团或ghc。。在通过添加-L/usr/lib进行编译时

ghc -L/usr/lib --make file.hs
cabal exec -- ghc -L/usr/lib --make BoardMain.hs
你甚至可以尝试添加 额外库目录: -/usr/lib 到我们的堆栈。亚马尔。有关这方面的更多信息,请参阅


或者在/opt/local/lib处禁用libconv,如果您确信它们不会中断其他文件中的某些链接。

/usr/lib
添加到库路径可能会导致链接不兼容的OS X库(如
/usr/libssl.
),而不是MacPorts one。最好直接链接OS X libiconv,而不是只更改一个库的库路径:

ghc-options: -optl/usr/lib/libiconv.dylib

这个问题实际上与x86_64无关,而是一个(C-)库版本控制问题。如果你在谷歌上搜索“Haskell OSX iconv”,你会得到一些有趣的点击。也许可以尝试一下搜索中的一些东西;希望其中一个能起作用。(如果是这样的话,你应该在这里写一个答案,说明哪件事对你有效!)如果我只是在ghc中添加“-L/usr/lib”,那么它在编译时不会出现这些iconv错误。i、 例如,$ghc-L/usr/lib--make file.hs@DanielWagner