2010-02-27 9 views
5

Per qualche motivo, dovrei usare gcc per compilare un file C, quindi collegarlo al progetto Visual C++ 2008.Come compilare GCC senza _alloca?

(ho usato l'attuale ultima versione gcc: gcc Cygwin 4.3.4 20090804.)

ma c'è un problema: gcc assegnare sempre un grande array con _alloca,

e VC linker non ci riesce risolvi il simbolo __alloca.

per esempio,

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

questo codice rende la dipendenza _alloca anche se non ho chiamato la funzione _alloca esplicitamente.

(le dimensioni contano serie se cambio 10240 -.> 128, tutto ok)

ho cercato opzione gcc -fno-builtin-alloca o -fno-incorporato, ma senza fortuna.

E 'possibile fare in modo che gcc non usi _alloca? (o regolare la soglia?)

+0

Perché non basta usare 'malloc()' in modo esplicito? –

+0

Non è la mia fonte scritta e piuttosto complessa da modificare. e forse l'autore originale non voleva che la penalità chiamasse malloc. – shkim

+1

Lo scopo di alloca in questo caso è assicurarsi che lo stack sia abbastanza grande da contenere questo array. Il compilatore Microsoft non ha bisogno di alloca; emette questo codice sonda stack direttamente nella funzione. La sonda stack non è necessaria quando i locali sono piccoli. Cosa succede se non usi -fno-builtin-alloca e -fno-builtin? –

risposta

7

La cosa migliore da fare sarebbe compilare tutto il codice con VC++. Se questo non è possibile ..

È necessario utilizzare il gcc mingw anziché cygwin. È progettato per generare codice che verrà collegato al runtime VC++, non alle librerie cygwin. In particolare, chiamerà la funzione di runtime VC++ __chkstk invece di __alloca.

+0

Ho provato MinGW (gcc 3.4.5 mingw-vista special r3) e ho compilato una semplice sorgente C. ma il risultato della discarica ha mostrato la dipendenza __alloca: dumpbin/symbols test.obj ... 00C 00000000 NOTIFICA UNDEF Esterno | __alloca ... c'è un'opzione speciale per mingw? – shkim

+0

Ah, mi dispiace. Il gcc mingw.org fa questo. Gli output di compilazione misti TDM GCC 4.x __chkstk. http://www.tdragon.net/recentgcc/ – andrewffff

+0

Grazie. Ho controllato che TDM gcc emette sempre __chkstk, ma VC2008 emette _chkstk su Release build e _alloca_probe su Debug build. Penso che dovrei modificare il codice per utilizzare i varaibles locali sotto 4K. – shkim

3

Si potrebbe semplicemente scrivere la propria routine _alloca e collegarsi a tale. Guarda la fonte della libreria gcc per vedere cosa dovrebbe fare.

+0

Quando ho implementato _alloca in VS2008, ho ricevuto: errore C2169: '_alloca': funzione intrinseca, non può essere definita – shkim

+0

Penso che probabilmente vorrai implementare il tuo _alloca personalizzato usando gcc piuttosto che Visual Studio. –

1

Sembra che _alloca sia stato deprecato da Microsoft e non sia più nelle loro librerie di runtime dopo VS2005. Le nuove librerie di runtime supportano _malloca.

Le tue opzioni non sembrano buone. Puoi provare a costruire con VS2005 invece. Forse cygwin ha un'opzione in cui puoi dire che stai usando una nuova libreria di runtime (e se non lo supportano ancora, puoi archiviarlo come richiesta di funzionalità).

Problemi correlati