我在项目上遇到问题。这个项目过去运行正常,我不完全确定是什么改变打破了它。我认为这与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}}生成的。我重新安装了几次没有解决方案。有什么想法吗?
答案 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 init
在项目目录中查找看起来像Haskell模块的文件,并将所有模块添加到exposed-modules
字段。对于不构成程序包公共接口一部分的模块,可以将这些模块移动到other-modules
字段。无论哪种方式,都需要列出库中的所有模块。
答案 2 :(得分:2)
卸载并重新安装 - 不是GHC,而是Xcode。这解决了我的问题。