20

我在我的项目上运行 cabal 时遇到问题。这个项目曾经正常运行,我不完全确定是什么改变破坏了它。我认为这与GHC 7.6 和 OSX Mavericks之间的问题有关(我在这里使用的是 Darin Morrison 的自制公式)。[编辑:澄清一下,这在小牛队的某个时候起作用,所以这个假设可能不成立。]问题似乎出在链接步骤中:

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

所有这些符号都来自我自己的项目(从名称来看)。我看到的关于此问题的大多数答案都与某个未正确链接的库有关。我怀疑其中一些符号是由deriveToJSONfrom生成的Data.Aeson.TH。我重装了几次都没有解决。有任何想法吗?

4

3 回答 3

31

这是最终解决的问题。我的阴谋集团配置是这样的:

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


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

Main.hs 用于可执行导入My.Module3My.Module3进口私人My.Module2. 包括My.Module2exposed-modules固定的问题。我想通了这一点,因为我意识到所有找不到的符号都来自该模块。cabal repl工作得很好(我手动测试了模块,它们基本上都可以工作),但cabal run没有。我觉得我应该能够在可执行文件中使用带有私有模块的库,但在这种情况下,我只是忘记将新模块添加到列表中,而且我没有理由将任何模块设为私有,所以我准备好了并暂时运行。

于 2013-11-03T00:18:20.013 回答
9

聚会有点晚了,但是您想要的是将未公开的模块放在该other-modules部分中。

阴谋集团用户指南

包中包含的模块

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

于 2015-10-20T17:27:24.443 回答
2

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

于 2013-11-02T06:01:45.607 回答