首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用-with-rtsopts ghc选项作为编译指示

使用-with-rtsopts ghc选项作为编译指示
EN

Stack Overflow用户
提问于 2012-05-28 23:58:10
回答 1查看 2.3K关注 0票数 10

我正在尝试解决Haskell中的一个算法难题,为此,我需要一个相当大的数据结构。然而,我提交解决方案的问题解决网站没有使用任何运行时选项来允许更大的堆栈,但我听说我可以使用编译器选项作为编译指示。我尝试在我的代码中使用以下杂注:

代码语言:javascript
复制
{-# OPTIONS_GHC -O2 -rtsopts -with-rtsopts=-K32m #-}

然后我用ghc --make algo.hs编译。然而,当我在我的机器上运行一些大型测试时,程序因堆栈溢出而崩溃,并报告当前堆栈大小为8MB。另一方面,当我像这样编译时:

代码语言:javascript
复制
ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp

该程序可以很好地处理相同的数据,而不需要添加任何+RTS参数。我使用的是GHC 7.0.2,但问题解决网站使用的是6.12.3,所以我最好也在寻找可以与旧版本一起工作的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-29 00:32:07

请记住,几乎任何类型的本机二进制文件的编译至少包括两个步骤:实际对象编译(.hs -> .o)和链接(.o.a.lib -> binary等)

当您使用以下代码进行编译时:

代码语言:javascript
复制
ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp

..。在幕后实际发生的事情基本上是:

代码语言:javascript
复制
# 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):

代码语言:javascript
复制
ghc -c algo.hs -rtsopts -with-rtsopts=-K32M
ghc -o algo -package somepackage algo.o

OPTIONS_GHC杂注告诉编译器在将特定模块编译成目标文件时添加的选项。因为-rtsopts是一个链接器选项(它告诉GHC链接到一组不同的命令行处理内容中),所以在编译目标文件时不能指定它。您必须在链接时指定它,并且不能在模块标头中指定此类选项。

有两种解决方案:

  1. 使用Cabal为你构建东西,并在你的.cabal文件中指定你想要的GHC选项
  2. 修复你的算法,这样你就不需要那么多的堆栈空间,例如通过使用尾递归和更严格的折叠。有关更多信息,请参见the wiki
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10787396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档