我正在尝试使用cabal install c2hs
安装c2hs。
我创建了~/.cabal/bin
来预先安装二进制文件。
使用命令cabal install c2hs
来获取错误。
src/Control/StateTrans.hs:77:1: Warning:
Module `Prelude' does not export `catch'
[ 3 of 26] Compiling Data.Errors ( src/Data/Errors.hs, dist/build/c2hs/c2hs-tmp/Data/Errors.o )
[ 4 of 26] Compiling Data.Attributes ( src/Data/Attributes.hs, dist/build/c2hs/c2hs-tmp/Data/Attributes.o )
[ 5 of 26] Compiling Text.Lexers ( src/Text/Lexers.hs, dist/build/c2hs/c2hs-tmp/Text/Lexers.o )
[ 6 of 26] Compiling Control.StateBase ( src/Control/StateBase.hs, dist/build/c2hs/c2hs-tmp/Control/StateBase.o )
[ 7 of 26] Compiling Data.NameSpaces ( src/Data/NameSpaces.hs, dist/build/c2hs/c2hs-tmp/Data/NameSpaces.o )
[ 8 of 26] Compiling C2HS.C.Attrs ( src/C2HS/C/Attrs.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Attrs.o )
[ 9 of 26] Compiling C2HS.C.Builtin ( src/C2HS/C/Builtin.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Builtin.o )
[10 of 26] Compiling Paths_c2hs ( dist/build/autogen/Paths_c2hs.hs, dist/build/c2hs/c2hs-tmp/Paths_c2hs.o )
dist/build/autogen/Paths_c2hs.hs:21:13: Not in scope: `catch'
dist/build/autogen/Paths_c2hs.hs:22:13: Not in scope: `catch'
dist/build/autogen/Paths_c2hs.hs:23:14: Not in scope: `catch'
dist/build/autogen/Paths_c2hs.hs:24:17: Not in scope: `catch'
cabal: Error: some packages failed to install:
c2hs-0.16.5 failed during the building phase. The exception was:
ExitFailure 1
安装有什么问题? ghc版本是7.6.3。
答案 0 :(得分:1)
这个安装现在在我的Ubuntu盒子上工作,所以我可以肯定地说c2hs现在并没有被所有人打破。
我认为您可能有版本问题....尝试
cabal update
再次尝试安装。
特别是 -
最近将Prelude.catch函数移动到Control.Exception.catch,请参阅https://ghc.haskell.org/trac/ghc/ticket/4865。我下载了c2hs源代码(使用cabal unpack c2hs),并查看了Paths_c2hs.hs需要的头文件(这似乎是带有导入问题的文件)。这是导入部分包含的内容 -
import qualified Control.Exception as Exception
import Data.Version (Version(..))
import System.Environment (getEnv)
import Prelude
(Paths_c2hs.hs是自动生成的,所以我必须先构建它。)
确实,它使用的是Control.Exception。因为这是一个基础模块,你应该拥有它,并且可能只是包含过时/不匹配的包。 (事实上,我的文件的行号与上面的错误消息行号不符 - 这是我们使用不同版本的另一个迹象,我相信我的是最新的:)。
虽然我认为“阴谋集更新”会解决问题,但如果没有,请尝试查看这两个地方 -
您的基础模块中是否存在Control.Exception.catch?只是尝试编译一个带有虚拟引用的空程序来捕获,就像这样 -
导入Control.Exception
x = catch
main = undefined
您自动生成的Paths_c2hs.hs是否指向正确的catch函数。只需使用cabal解压缩,配置和构建c2hs,然后查看dist / build / autogen / Paths_c2hs.hs。 (您可能会在构建阶段遇到错误,但鉴于您在上面显示的内容,它将在创建Paths_c2hs.hs之后发生。)
答案 1 :(得分:0)
问题是我在我的mac上安装了两个不同版本的ghc:一个来自brew install ghc
,另一个来自haskell platform。
我必须安装最新版本的haskell平台,但在此之前我还需要卸载旧版本uninstall-hs only VERSION
和brew unistall ghc
。
重新安装最新的haskell平台后,编译工作正常。
其他方法可以使用brew brew install haskell-platform
。