在Clion中增加C程序的堆栈大小

3

如何增加C程序的堆栈最大大小,以便进行深度递归调用?是否有项目配置可以为可执行文件指定堆栈或堆大小?


1
如果您在Linux或其他*nix操作系统上,您可以在代码中设置堆栈大小-请参阅此问题和答案获取代码。 - Paul R
我正在Windows上使用Cygwin环境进行操作。 - arslancharyev31
1
我相信Cygwin也支持getrlimit/setrlimit,所以建议尝试一下。 - Paul R
我尝试复制粘贴答案中的代码,并在主函数末尾运行递归函数,但没有任何变化。 - arslancharyev31
1
你可能需要调整 kStackSize - 你认为你的程序需要多少堆栈空间? - Paul R
1
初始线程堆栈大小由链接器设置。您可以在构建时要求链接器增加它。 - ThingyWotsit
4个回答

7

我通过在项目的 CMakeList.txt 中添加以下链接器标志解决了这个问题。

MATH(EXPR stack_size "16 * 1024 * 1024") # 16 Mb
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,${stack_size}")

1
这对我也起作用了。请注意,这也可以使用 target_link_libraries()set_target_properties() 完成,如此处所示。 - Gumby The Green
1
@GumbyTheGreen,不错的解决方案。你考虑过将其发布为答案,这样我就可以接受它,而不是自私地接受自己的解决方案 :) - arslancharyev31
做出改变自私的行为来,永远不会太晚… :) 不,实际上我也觉得你的回答很有帮助,并且现在我正在将那个数学表达式用在自己的脚本中。 - Gumby The Green

1

为了扩展原作者的回答,以下三个CMake命令在我使用MinGW/GCC的Windows上都可以正常工作(将<target>替换为您在add_executable()中输入的内容):

target_link_libraries(<target> PRIVATE "-Wl,--stack,10000000")

或者

set_target_properties(<target> PROPERTIES LINK_FLAGS -Wl,--stack,10000000)

或者

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--stack,10000000")

根据CMake documentation,每个都应该只添加链接器标志,而不是替换任何已经设置的标志。
在Visual Studio中,根据this thread和其他线程的指示,应将-Wl,--stack,替换为/STACK:。例如:
target_link_libraries(<target> PRIVATE "/STACK:10000000")

1

0
在macOS(OS X)或Linux上使用以下代码:
```set(CMAKE_EXE_LINKER_FLAGS "-Wl,-stack_size,4000000")```
注意:该数字被解释为十六进制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接