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

20
我在我的项目上执行cabal run时遇到了问题。这个项目以前可以正常运行,我不确定是什么改变导致了它的崩溃。我认为这可能与GHC 7.6和OSX Mavericks之间的问题有关(我在这里使用Darin Morrison的homebrew配方)。[编辑:澄清一下,这在Mavericks上曾经可以工作,所以这个假设可能不成立。]问题似乎出现在链接步骤中:
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

所有这些符号都来自我的项目(根据名称判断)。我看到的大多数答案都与某个库没有正确链接有关。我怀疑一些符号是由Data.Aeson.TH中的deriveToJSON生成的。我已经重新安装了几次,但没有解决。有什么想法吗?

3个回答

31

以下是最终解决方法。我的cabal配置文件大致如下:

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.Module3模块。My.Module3模块导入了私有模块My.Module2。将My.Module2模块包含在exposed-modules下修复了问题。我发现无法找到的所有符号都来自该模块,因此得出了这个结论。使用cabal repl没有问题(我手动测试了所有模块,它们基本上都可以工作),但是cabal run则不行。我觉得我应该能够在可执行文件中使用带有私有模块的库,但在这种情况下,我只是忘记将新模块添加到列表中,并且我没有理由使任何模块私有,所以现在我已经运行起来了。


这对我起作用。我有一个私有的额外模块,和一个仅导入公共模块的测试。 - sam boosalis
3
这种方法对我也有效,但我同意似乎存在更深层次的问题。你不应该被迫暴露所有内部使用的模块,这是没有意义的。 - Will Sewell
谢谢!我遇到了同样的错误,我不小心忘记在我的构建依赖中包含一个模块。将其添加到我的“exposed-modules”中解决了问题。 - Ecognium

9
有点晚了,但是您想要的是将未公开的模块放在other-modules部分。
根据Cabal用户指南

包含在软件包中的模块

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


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

不行。我卸载了XCode并重试了一遍。还是不行。然后我又尝试重新安装ghc和cabal-install(以防万一新安装的构建工具能做得更好)。我最后刚刚再次检查,但那也没用。 - benekastah

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