我正在尝试解决Haskell中的一个算法难题,为此,我需要一个相当大的数据结构。然而,我提交解决方案的问题解决网站没有使用任何运行时选项来允许更大的堆栈,但我听说我可以使用编译器选项作为编译指示。我尝试在我的代码中使用以下杂注:
{-# OPTIONS_GHC -O2 -rtsopts -with-rtsopts=-K32m #-}然后我用ghc --make algo.hs编译。然而,当我在我的机器上运行一些大型测试时,程序因堆栈溢出而崩溃,并报告当前堆栈大小为8MB。另一方面,当我像这样编译时:
ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp该程序可以很好地处理相同的数据,而不需要添加任何+RTS参数。我使用的是GHC 7.0.2,但问题解决网站使用的是6.12.3,所以我最好也在寻找可以与旧版本一起工作的解决方案。
发布于 2012-05-29 00:32:07
请记住,几乎任何类型的本机二进制文件的编译至少包括两个步骤:实际对象编译(.hs -> .o)和链接(.o、.a、.lib -> binary等)
当您使用以下代码进行编译时:
ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp..。在幕后实际发生的事情基本上是:
# object compilation - creates algo.o
ghc -c algo.hs -fforce-recomp
# linking - links together algo.o and libHSsomepackage.a into the "algo" binary
# (we assume that `algo.hs` included some module from the package `somepackage`
# e.g. `Data.Package.Some`)
ghc -rtsopts -with-rtsopts=-K32M -o algo -package somepackage algo.o例如,--make选项告诉GHC在链接结果之前自动编译目标文件,它会为您填补大量空白。注意各个命令行标志的结束位置。
当您在文件顶部指定该编译指示时,将发生以下情况(使用ghc --make algo.hs):
ghc -c algo.hs -rtsopts -with-rtsopts=-K32M
ghc -o algo -package somepackage algo.oOPTIONS_GHC杂注告诉编译器在将特定模块编译成目标文件时添加的选项。因为-rtsopts是一个链接器选项(它告诉GHC链接到一组不同的命令行处理内容中),所以在编译目标文件时不能指定它。您必须在链接时指定它,并且不能在模块标头中指定此类选项。
有两种解决方案:
.cabal文件中指定你想要的GHC选项https://stackoverflow.com/questions/10787396
复制相似问题