Visual c++ 如何在没有alloca的情况下编译GCC? 由于某种原因,我应该使用GCC编译一个C文件,然后链接到Visual C++ 2008项目。

Visual c++ 如何在没有alloca的情况下编译GCC? 由于某种原因,我应该使用GCC编译一个C文件,然后链接到Visual C++ 2008项目。,visual-c++,gcc,alloca,Visual C++,Gcc,Alloca,(我使用了当前最新的gcc版本:cygwin gcc 4.3.4 20090804。) 但有一个问题:gcc总是用alloca分配一个大数组 VC链接器无法解析符号\uuuu alloca 比如说, int func() { int big[10240]; .... } 虽然我没有显式调用_alloca函数,但这段代码生成了_alloca依赖项 (数组大小很重要。如果我更改10240->128,一切正常) 我尝试了gcc选项-fno-builtin-alloca或-fno-bu

(我使用了当前最新的gcc版本:cygwin gcc 4.3.4 20090804。)

但有一个问题:gcc总是用alloca分配一个大数组

VC链接器无法解析符号\uuuu alloca

比如说,

int func()
{
    int big[10240];
    ....
}
虽然我没有显式调用_alloca函数,但这段代码生成了_alloca依赖项

(数组大小很重要。如果我更改10240->128,一切正常)

我尝试了gcc选项-fno-builtin-alloca或-fno-builtin,但没有成功


是否有可能使gcc不使用_alloca?(或者调整阈值?

您只需编写自己的alloca例程并链接即可。查看gcc库的源代码,看看它应该做什么。

最好是用VC++编译所有代码。如果那不可能

您应该使用gcc而不是cygwin。它的设计目的是输出将链接到VC++运行时的代码,而不是cygwin库。特别是,它将调用VC++运行时函数chkstk而不是alloca。

它看起来已被Microsoft弃用,并且在VS2005之后不再位于其运行时库中。较新的运行库支持


你的选择看起来不太好。您可以尝试使用VS2005进行构建。也许cygwin有一个选项,您可以告诉它您正在使用更新的运行库(如果他们还不支持,您可以将其作为功能请求进行归档)。

一些相关讨论:


为什么不直接使用
malloc()
呢?它不是我写的源代码,编辑起来有点复杂。也许原始作者不希望惩罚调用malloc。在本例中,alloca的目的是确保堆栈足够大,可以容纳这个数组。Microsoft编译器不需要alloca;它将堆栈探测代码直接发送到函数中。当局部变量较小时,不需要堆栈探测器。如果不使用-fno-builtin-alloca和-fno-builtin会发生什么?哦,天哪,10k是一个需要放在堆栈上的巨大对象,不管它是否有效都是一个可怕的想法。你能改变密码不这样做吗?@ephe:(1)这不是他的密码。(2) 没有适当的
free
更改为
malloc
会导致泄漏。我尝试了MinGW(gcc 3.4.5 MinGW vista special r3)并编译了一个简单的C源代码。但是dumpbin结果显示了u alloca依赖性:dumpbin/symbols test.obj。。。00C 00000000未定义非类型外部| uu分配。。。mingw有特别的选择吗?啊,对不起。org gcc就是这样做的。TDM GCC 4.x mingw构建输出_chkstk。非常感谢。我检查了TDM gcc总是输出chkstk,但VC2008在发布版本上输出chkstk,在调试版本上输出alloca探测。我想我应该编辑代码以使用4K以下的本地变量。当我在VS2008中实现_alloca时,我得到:错误C2169:“_alloca”:内在函数,无法定义。我想您可能希望使用gcc而不是Visual Studio实现自定义_alloca。