我正在尝试通过共享库向Haskell发送大量数据,大小为几千兆字节。一切似乎都很好,但我最终得到了错误:
堆栈空间溢出:当前大小为8388608字节。 使用`+ RTS -Ksize'增加它。
基本上,我的问题是:如何增加Haskell堆栈大小?
我试过了:
1)在构建共享库时将相应的-rtsopts标志传递给链接器 - 没有运气,但这是预期的,因为我使用Haskell作为共享库。
2)使用此链接中所述的RTS标志调用hs_init: Haskell User Guide FFI/GHC ......也没用。
int argc = 2;
char *argv[] = { "+RTS", "-K100M", NULL };
char **pargv = argv;
// Initialize Haskell runtime
hs_init(&argc, &pargv);
基本上我认为这些参数也被忽略了,因为我没有使用Haskell main,这也在我提供的用户指南链接中描述。
注意:我也试过这种方法添加" -RTS"到NULL之前的列表并增加argc,但没有区别。
3)我怀疑这个问题的真正解决方案是遵循给定链接中的8.2.1.1节,并对hs_init_ghc进行特殊调用:
#include "HsFFI.h"
#include "Rts.h"
RtsConfig conf = defaultRtsConfig;
conf.rts_opts_enabled = RtsOptsAll;
hs_init_ghc(&argc, &argv, conf);
但是,当我尝试按照指南中的描述执行此操作时,我的C代码调用:
hs_init_ghc
由于我已经粘贴到这个问题的底部的一大堆错误,将无法编译。似乎包括RTS.h
不会编译,但我完全按照这个例子,并编译:
ghc -c foo.cpp
我想知道当使用Haskell作为C ++的共享库时,是否有人对如何解决此编译错误或将堆栈大小设置为更大的值有任何建议?
我也尝试过设置相应的环境变量,这也是行不通的。我甚至收到一条消息说它会被忽略。
我正在使用GHC版本7.4.1
非常感谢你的帮助。
- JL
编译错误包括:
>
在/usr/lib/ghc/include/Rts.h:222:0中包含的文件中: 0,来自foo.cpp:6:
/usr/lib/ghc/include/rts/storage/Block.h:227:26: 错误:在'新'之前预期','或'...' dbl_link_replace(bdescr * new,bdescr * old,bdescr ** list) ^ /usr/lib/ghc/include/rts/storage/Block.h:在函数'void dbl_link_replace(bdescr *)'中:
/usr/lib/ghc/include/rts/storage/Block.h:229:8: 错误:' - >'标记之前的预期类型说明符 new-> link = old-> link; ^
/usr/lib/ghc/include/rts/storage/Block.h:229:8: 错误:预期';'在' - >'标记
之前/usr/lib/ghc/include/rts/storage/Block.h:230:8: 错误:' - >'标记之前的预期类型说明符 new-> u.back = old-> u.back; ^
/usr/lib/ghc/include/rts/storage/Block.h:230:8: 错误:预期';'在' - >'标记
之前/usr/lib/ghc/include/rts/storage/Block.h:231:9: 错误:在此范围内未声明'old' if(old-> link){ ^
/usr/lib/ghc/include/rts/storage/Block.h:232:32: 错误:';'标记之前的预期类型说明符 old-> link-> u.back = new; ^
/usr/lib/ghc/include/rts/storage/Block.h:234:9: 错误:在此范围内未声明'old' if(old-> u.back){ ^
/usr/lib/ghc/include/rts/storage/Block.h:235:32: 错误:';'标记之前的预期类型说明符 old-> u.back-> link = new; ^
/usr/lib/ghc/include/rts/storage/Block.h:237:10: 错误:未在此范围内声明'list' * list = new; ^
/usr/lib/ghc/include/rts/storage/Block.h:237:20: 错误:';'标记之前的预期类型说明符 * list = new; ^
在/usr/lib/ghc/include/Rts.h:218:0中包含的文件中: 0, 来自foo.cpp:6: /usr/lib/ghc/include/rts/storage/ClosureMacros.h:在函数'rtsBool
中删除了更多编译错误......但可根据要求提供。