zlib与GHC构建错误

时间:2012-01-22 13:27:47

标签: haskell zlib ghc cabal archlinux

我正在使用具有以下配置的VM:

  • Arch Linux(3.0-ARCH内核)
  • GHC 7.0.3
  • cabal-install 0.10.2
  • Cabal library 1.10.1.0

当我尝试使用cabal构建zlib时......

$ cabal install zlib

我得到以下输出:

Resolving dependencies...
Downloading zlib-0.5.3.2...
Configuring zlib-0.5.3.2...
Preprocessing library zlib-0.5.3.2...
Stream.hsc:86:21: error: missing binary operator before token "("
Stream.hsc: In function ‘main’:
Stream.hsc:86:21: error: missing binary operator before token "("
Stream.hsc:86:21: error: missing binary operator before token "("
compiling dist/build/Codec/Compression/Zlib/Stream_hsc_make.c failed (exit code 1)
command was: /usr/bin/gcc -c dist/build/Codec/Compression/Zlib/Stream_hsc_make.c -o dist/build/Codec/Compression/Zlib/Stream_hsc_make.o -fno-stack-protector -fno-stack-protector -D__GLASGOW_HASKELL__=700 -Dlinux_BUILD_OS -Dlinux_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/usr/lib/ghc-7.0.3/bytestring-0.9.1.10/include -I/usr/lib/ghc-7.0.3/base-4.3.1.0/include -I/usr/lib/ghc-7.0.3/include -I/usr/lib/ghc-7.0.3/include -I/usr/lib/ghc-7.0.3/include/
cabal: Error: some packages failed to install:
zlib-0.5.3.2 failed during the building phase. The exception was:
ExitFailure 1

有人能解释一下这个构建错误吗?


修改:以下是来自Stream.hsc的代码段,其中包含行号:

 82 import Foreign
 83          ( Word8, Ptr, nullPtr, plusPtr, peekByteOff, pokeByteOff, mallocBy    tes  
 84          , ForeignPtr, FinalizerPtr, newForeignPtr_, addForeignPtrFinalizer
 85          , withForeignPtr, touchForeignPtr )
 86 #if MIN_VERSION_base(4,4,0)
 87 import Foreign.ForeignPtr.Unsafe ( unsafeForeignPtrToPtr )
 88 import System.IO.Unsafe          ( unsafePerformIO )
 89 #else
 90 import Foreign ( unsafeForeignPtrToPtr, unsafePerformIO )
 91 #endif

5 个答案:

答案 0 :(得分:11)

由于某种原因,MIN_VERSION_base宏不会被扩展,因此预处理器会看到它当然无法处理的条件MIN_VERSION_base(4,4,0)。我还没有找到为什么宏没有扩展,但解决方法是

  1. 安装zlib-0.5.3.1而不是
  2. 解压缩tarball并编辑Codec/Compression/Zlib/Stream.hsc以删除有问题的宏(您使用的是7.0.3,因此您的基本版本是4.3.1.0,您可以将宏替换为0)
  3. 编辑:稍微探讨一下后,我发现要隐藏这些预处理器指令,这些指令不适合hsc2hs处理,它们必须被额外的掩盖'#'。错误报告正在进行中。

答案 1 :(得分:10)

在Ubuntu上,我用

修复(或真的,避免)类似的错误
sudo apt-get install libghc-zlib-dev  libghc-zlib-bindings-dev

(我不知道是否需要两者。)

答案 2 :(得分:6)

我仍然在GHC 7.8.4上使用haskell软件包zlib-0.5.4.2遇到这个问题。我认为这个问题是图书馆的非标准位置。我通过手工安装zlib 1.2.8解决了这个问题,然后做了:

cabal install zlib --extra-lib-dirs=/usr/local/lib --extra-include-dir=/usr/local/include

答案 3 :(得分:2)

最可能的原因是您的计算机上缺少zlib C库标头。您可能会尝试使用Arch Linux“Haskell Platform”或haskell-zlib包来解决C依赖关系。

答案 4 :(得分:2)

我不明白这个错误,但是在尝试使用GHC 7.4安装Agda 2.3时,今天早些时候也发生了这种情况。来自#agda的Saizan建议我尝试

cabal unpack zlib
cd zlib-0.5.3.2/
runghc Setup configure --user; runghc Setup build; runghc Setup install

这被证明是有效的。但我仍然对实际上的问题一无所知。

尽管如此,我认为我会分享。