2010-02-27 7 views
5

Pour une raison quelconque, je devrais utiliser gcc pour compiler un fichier C, puis lier le projet Visual C++ 2008.Comment compiler GCC sans _alloca?

(j'ai utilisé la dernière version gcc actuelle: gcc Cygwin 4.3.4 20090804.)

Mais il y a un problème: gcc toujours allouer un grand tableau avec _alloca,

et éditeur de liens VC ne peux pas résoudre le symbole __alloca.

par exemple,

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

ce code rend la dépendance _alloca bien que je ne l'ai pas appeler la fonction _alloca explicitement.

(questions de taille de tableau si je change 10240 -.> 128, tout est ok)

J'ai essayé gcc option -fno-builtin-alloca ou -fno-builtin, mais pas de chance.

Est-il possible de faire en sorte que gcc n'utilise pas _alloca? (ou ajuster le seuil?)

+0

Pourquoi ne pas simplement utiliser 'malloc()' explicitement? –

+0

Ce n'est pas ma source écrite et quelque peu complexe à éditer. et peut-être que l'auteur original ne voulait pas que la pénalité appelle malloc. – shkim

+1

Le but de alloca dans ce cas est de s'assurer que la pile est assez grande pour contenir ce tableau. Le compilateur Microsoft n'a pas besoin d'alloca; il émet ce code de sonde de pile directement dans la fonction. La sonde de cheminée n'est pas nécessaire lorsque les locaux sont petits. Que se passe-t-il si vous n'utilisez pas -fno-builtin-alloca et -fno-builtin? –

Répondre

7

La meilleure chose à faire serait de compiler tout le code avec VC++. Si ce n'est pas possible ..

Vous devriez utiliser le mingw gcc au lieu de celui de cygwin. Il est conçu pour générer du code qui sera lié à l'environnement d'exécution VC++, et non aux bibliothèques cygwin. En particulier, il appellera la fonction d'exécution VC++ __chkstk au lieu de __alloca.

+0

J'ai essayé MinGW (gcc 3.4.5 mingw-vista spécial r3) et compilé une source C simple. mais le résultat de vidage a montré __alloca dépendance: dumpbin/symbols test.obj ... 00C 00000000 UNDEF notype Externe | __alloca ... Y at-il une option spéciale pour mingw? – shkim

+0

Ah, désolé. Le mcww.org gcc fait cela. La sortie de génération TDM GCC 4.x mingw __chkstk. http://www.tdragon.net/recentgcc/ – andrewffff

+0

Merci. J'ai vérifié que TDM gcc produisait toujours __chkstk, mais VC2008 sortait _chkstk lors de la version Release, et _alloca_probe dans la version Debug. Je pense que je devrais éditer le code pour utiliser les variables locales sous 4K. – shkim

3

Vous pourriez simplement écrire votre propre routine de _alloca et lier contre cela. Regardez la source de la bibliothèque gcc pour voir ce qu'elle est censée faire.

+0

Quand j'ai implémenté _alloca dans VS2008, j'ai obtenu: erreur C2169: '_alloca': fonction intrinsèque, impossible à définir – shkim

+0

Je pense que vous voudrez probablement implémenter votre _alloca personnalisé en utilisant gcc plutôt que Visual Studio. –

1

Il semble que _alloca a été abandonné par Microsoft et n'est plus dans leurs bibliothèques d'exécution après VS2005. Les nouvelles bibliothèques d'exécution prennent en charge _malloca.

Vos options ne sont pas bonnes. Vous pouvez essayer de construire avec VS2005 à la place. Peut-être que cygwin a une option où vous pouvez lui dire que vous utilisez une nouvelle bibliothèque d'exécution (et si elles ne le supportent pas encore, vous pouvez le classer comme une demande de fonctionnalité).

Questions connexes