5

不是编程问题,但我第一次看到这样的东西。
UNR 1.6(基于 Ubuntu 10.04)安装 6.12.1 版本的 GHC。
因此,为了构建 cabal-install-0.8.2,我必须安装
parsec、mtl、network 和 zlib 的 libghc6- 包。
然后,在启动 'sh ./bootstrap.sh' 后,我得到:

检查已安装的 ghc-6.12.1 软件包...
parsec 已安装且版本正常。
网络已经安装,版本没问题。
Cabal 已经安装,版本没问题。
mtl 已经安装,版本没问题。
HTTP 已经安装并且版本没问题。
zlib 已经安装,版本没问题。
[1 of 1] 编译主程序(Setup.hs、Setup.o)
链接安装程序...
配置 cabal-install-0.8.2...
为 cabal-install-0.8.2 预处理可执行文件...
构建 cabal-install- 0.8.2...
[ 1 / 40] 编译 Distribution.Client.BuildReports.Types ( Distribution/Client/BuildReports/Types.hs, dist/build/cabal/cabal-tmp/Distribution/Client/BuildReports/Types.o )
[ 2 / 40] 编译Distribution.Client.Utils ( Distribution/Client/Utils.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Utils.o )

...关于未使用 addPackageExcludeConstraint 和响应的两个警告...

[39 of 40] 编译 Distribution.Client.Install ( Distribution/Client/Install.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Install.o )
[40 of 40] 编译 Main ( Main.hs, dist/build/cabal/cabal-tmp/Main.o )
链接 dist/build/cabal/cabal ...
collect2: ld 以信号 9 终止 [Processus arrêté]

cabal-install 引导期间出错:
构建 cabal-install 包失败

在链接和 collect2 之间(一分钟左右),我的硬盘驱动器的 LED 闪烁
,好像有很多文件被写入或读取。

我不知道它是否相关,但这里是依赖关系
Cabal-1.8.0.2
HTTP-4000.0.6
mtl-1.1.0.2
network-2.2.1.7
parsec-2.1.0.1
zlib-0.5.2.0 的版本

4

3 回答 3

7

正在发生的事情是内核正在杀死ld链接器进程,因为它使用了太多的内存。

原因ld是使用了这么多内存是因为一个名为“split objs”的功能,其结果是标准库之类libHSbase.a的包含成千上万个小.o文件。链接器未针对此用例进行优化,最终会使用大量内存。

“split objs”功能旨在通过仅链接实际使用的标准库的位来使编译的程序更小。它通过将每个已编译的 Haskell 模块拆分.o为每个函数的单独文件来工作。

所以这对于内存较少的系统来说显然是一个问题,比如你的上网本。您链接的任何内容都可能发生这种情况,而不仅仅是cabal. 可以在关闭 splitobjs 功能的情况下从源代码构建 ghc。例如,Gentoo 会自动为内存为 512Mb 或更少的机器执行此操作。因此,如果您想在上网本上可靠地使用 ghc,您可能需要从源代码构建它而不使用 splitobjs。您可以在功能稍强的机器上构建 ghc,然后将其传输到您的上网本。

将来,当我们切换到在 Linux 上默认使用共享库时,这个问题就会消失。

于 2010-06-29T22:36:52.533 回答
1

我有同样的问题。我随时在 ghc- 中添加 splitobjs=NO .ebuild。然后我重建了 ghc,但 cabal-install 仍然无法通过 ld。因为我的 gentoo 盒子没有交换分区。所以我使用我的 2G USB 磁盘来创建一个临时交换分区。然后我可以建立 cabal-install 成功。我发现它会使用额外的 100M 交换空间,而我的 eeepc 有 512M 内存。所以我认为你可以使用一个超过100M空间的U盘。只是: mkswap /dev/sd* swapon /dev/sd*

于 2011-03-02T09:14:56.020 回答
0

dd if=/dev/zero of=/swapfile bs=1024 count=2048k mkswap /swapfile swapon /swapfile

于 2013-10-30T15:37:00.657 回答