无法编译haskell项目:链接步骤失败

时间:2013-11-02 05:58:33

标签: haskell ghc cabal osx-mavericks

我在项目上遇到问题。这个项目过去运行正常,我不完全确定是什么改变打破了它。我认为这与GHC 7.6 and OSX Mavericks之间的问题有关(我正在使用Darin Morrison's homebrew formulae here)。 [编辑:澄清一下,这在小牛队的某个方面有效,所以这个假设可能不会成功。]问题似乎出现在链接步骤中:

In-place registering chorez-0.1.0.0...
Preprocessing executable 'chorez' for chorez-0.1.0.0...
Linking dist/build/chorez/chorez ...
Undefined symbols for architecture x86_64:
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_AddResponse_con_info", referenced from:
      _s5X4_info in libHSchorez-0.1.0.0.a(Commands.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_ErrorResponse_static_info", referenced from:
      _chorezzzm0zi1zi0zi0_ChorezzziCommands_route1_closure in libHSchorez-0.1.0.0.a(Commands.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_parseRequest_closure", referenced from:
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_parseRequest_info", referenced from:
      _s7nh_info in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse1_closure", referenced from:
      _r7eS_closure in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse4_closure", referenced from:
      _s7ng_info in libHSchorez-0.1.0.0.a(Server.o)
      _r7eQ_closure in libHSchorez-0.1.0.0.a(Server.o)
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse5_closure", referenced from:
      _s7ng_info in libHSchorez-0.1.0.0.a(Server.o)
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

所有这些符号都来自我自己的项目(根据名称判断)。我见过的大多数答案都与某个未正确链接的库有关。我怀疑其中一些符号是由deriveToJSON {{1}}生成的。我重新安装了几次没有解决方案。有什么想法吗?

3 个答案:

答案 0 :(得分:31)

这是最终修复它的内容。我的cabal配置是这样的:

library
  exposed-modules:
      My.Module1
    , My.Module3


executable my-executable
  main-is:             Main.hs
  build-depends:
      base >=4.6 && <4.7
    , chorez

可执行文件导入My.Module3的Main.hs。 My.Module3导入私有My.Module2。在My.Module2下添加exposed-modules修复了此问题。我想出了这个,因为我意识到所有无法找到的符号来自该模块。 cabal repl工作得很好(我手工测试了模块,它们基本都可以工作),但cabal run没有。我觉得我应该能够在可执行文件中使用带有私有模块的库,但是在这种情况下我只是忘了将新模块添加到列表中,而我没有理由将任何模块设为私有,所以我起来了现在就跑了。

答案 1 :(得分:9)

派对有点晚了,但你想要的是将未曝光的模块放在other-modules部分。

来自Cabal User Guide

  

包中包含的模块

     

对于库,cabal init在项目目录中查找看起来像Haskell模块的文件,并将所有模块添加到exposed-modules字段。对于不构成程序包公共接口一部分的模块,可以将这些模块移动到other-modules字段。无论哪种方式,都需要列出库中的所有模块。

答案 2 :(得分:2)

卸载并重新安装 - 不是GHC,而是Xcode。这解决了我的问题。