2010-02-27 14 views
5

Por alguna razón, debería usar gcc para compilar un archivo C, luego vincularlo con el proyecto Visual C++ 2008.¿Cómo compilar GCC sin _alloca?

(he utilizado la última versión actual de gcc: gcc cygwin 4.3.4 20090804.)

Pero hay un problema: gcc siempre asignar una gran matriz con _alloca,

y VC enlazador no puedo resolver el símbolo __alloca.

por ejemplo,

int func() 
{ 
    int big[10240]; 
    .... 
} 

este código hace que la dependencia _alloca aunque no me llama a la función _alloca explícitamente.

(el tamaño importa si cambio de matriz 10240 -.> 128, todo muy bien)

me trataron opción de gcc--fno incorporado alloca-o--fno orden interna, pero no hubo suerte.

¿Es posible hacer que gcc no use _alloca? (¿o ajustar el umbral?)

+0

¿Por qué no usar 'malloc()' explícitamente? –

+0

No es mi fuente escrita y algo compleja de editar. y tal vez el autor original no quería que la penalización llamara a malloc. – shkim

+1

El propósito de alloca en este caso es asegurarse de que la pila sea lo suficientemente grande como para contener esta matriz. El compilador de Microsoft no necesita alloca; Emite este código de sonda de pila directamente en la función. La sonda de pila no es necesaria cuando los locales son pequeños. ¿Qué sucede si no usa -fno-builtin-alloca y -fno-builtin? –

Respuesta

7

Lo mejor que se puede hacer es compilar todo el código con VC++. Si eso no es posible ...

Debe usar el mingw gcc en lugar del cygwin. Está diseñado para generar código que se vinculará con el tiempo de ejecución de VC++, no con las bibliotecas de cygwin. En particular, llamará a la función de tiempo de ejecución de VC++ __chkstk en lugar de __alloca.

+0

Probé MinGW (gcc 3.4.5 mingw-vista special r3) y compilé una simple fuente C. pero el resultado del dumpbin mostró la dependencia __alloca: dumpbin/symbols test.obj ... 00C 00000000 UNDEF notype Externo | __alloca ... ¿hay alguna opción especial para mingw? – shkim

+0

Ah, lo siento. El mingw.org gcc hace esto. La construcción de mingw TDM GCC 4.x produce __chkstk. http://www.tdragon.net/recentgcc/ – andrewffff

+0

Gracias. Comprobé que TDM gcc siempre produce __chkstk, pero VC2008 genera _chkstk en Release build y _alloca_probe en Debug build. Creo que debería editar el código para usar varaibles locales en 4K. – shkim

3

Puede escribir su propia rutina _alloca y vincularla con eso. Mire la fuente de la biblioteca gcc para ver qué se supone que debe hacer.

+0

Cuando implementé _alloca en VS2008, obtuve: error C2169: '_alloca': función intrínseca, no se puede definir – shkim

+0

Creo que probablemente desee implementar su _alloca personalizado usando gcc en lugar de Visual Studio. –

1

Parece que _alloca ha sido desaprobado por Microsoft y ya no está en sus bibliotecas de tiempo de ejecución después de VS2005. Las bibliotecas de tiempo de ejecución más nuevas admiten _malloca.

Sus opciones no se ven bien. Puede intentar construir con VS2005 en su lugar. Quizás cygwin tiene una opción en la que puede decir que está utilizando una biblioteca de tiempo de ejecución más nueva (y si aún no la admite, puede archivarla como una solicitud de función).

Cuestiones relacionadas