在使用GNU编译器进行编译期间,在Linux中更改C ++应用程序的堆栈大小

在使用g++进行C ++程序编译的OSX中

 LD_FLAGS= -Wl,-stack_size,0x100000000 

但在SUSE Linux中,我经常会遇到如下错误:

 x86_64-suse-linux/bin/ld: unrecognized option '--stack' 

和类似的。

我知道这是可以使用的

 ulimit -s unlimited 

但是这并不好,因为一个用户不会总是这么做。

如何在单个应用程序中使用GCC增加Linux的堆栈大小?

你可以用setrlimit以编程方式设置堆栈大小,例如

 #include <sys/resource.h> int main (int argc, char **argv) { const rlim_t kStackSize = 16 * 1024 * 1024; // min stack size = 16 MB struct rlimit rl; int result; result = getrlimit(RLIMIT_STACK, &rl); if (result == 0) { if (rl.rlim_cur < kStackSize) { rl.rlim_cur = kStackSize; result = setrlimit(RLIMIT_STACK, &rl); if (result != 0) { fprintf(stderr, "setrlimit returned result = %d\n", result); } } } // ... return 0; } 

注意:即使使用这种方法来增加堆栈大小,也不应该在main()本身中声明大的局部变量,因为在getrlimit / setrlimit代码出现之前,只要输入main()就可能发生堆栈溢出改变堆栈大小的机会。 因此,任何大的局部变量只能在函数中定义,这些函数在成功增加堆栈大小之后,将从main()调用。

而不是stack_size ,使用--stack像这样:

 gcc -Wl,--stack,4194304 -o program program.c 

这个例子应该给你4 MB的堆栈空间。 在MinGW的GCC上工作,但正如手册中所说:“这个选项是特定于连接器的i386 PE目标端口”(即仅用于输出Windows二进制文件)。 似乎没有ELF二进制文件的选项。

使用ulimit bash内建值或setrlimit()或使用PAM登录(pam_limits.so)来更改它。

这是一个可设置的用户资源限制; 请参阅selimlimit(2)中的RLIMIT_STACK。

http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc

考虑使用-fsplit-stack选项https://gcc.gnu.org/wiki/SplitStacks