2010-02-27 2 views
5

По какой-то причине я должен использовать gcc для компиляции файла C, а затем ссылку на проект Visual C++ 2008.Как компилировать GCC без _alloca?

(я использовал текущую последнюю версию GCC: Cygwin GCC 4.3.4 20090804.)

Но есть одна проблема: НКУ всегда выделить большой массив с _alloca,

и VC линкер не может разрешить символ __alloca.

, например,

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

этот код делает зависимость _alloca хотя я не вызвать функцию _alloca явно.

(размер имеет значение массива, если я изменить 10240 -.> 128, все в порядке)

Я попытался Gcc вариант -fno-встроено-ALLOCA или -fno встроенная_команда_оболочки, но не повезло.

Можно ли использовать gcc, чтобы не использовать _alloca? (или отрегулировать порог?)

+0

Почему просто не использовать 'таНос()' явно? –

+0

Это не мой письменный источник и несколько сложный для редактирования. и, возможно, оригинальный автор не хотел, чтобы штраф назывался malloc. – shkim

+1

Назначение alloca в этом случае - убедиться, что стек достаточно велик для хранения этого массива. Компилятору Microsoft не требуется alloca; он испускает этот код датчика стека непосредственно в функцию. Зонд стека не нужен, когда местные жители малы. Что произойдет, если вы не используете -fno-builtin-alloca и -fno-builtin? –

ответ

7

Лучше всего было бы скомпилировать весь код с помощью VC++. Если это невозможно ..

Вы должны использовать mingw gcc вместо cygwin. Он предназначен для вывода кода, который будет связан с средой исполнения VC++, а не с библиотеками cygwin. В частности, он вызовет функцию времени исполнения VC++ __chkstk вместо __alloca.

+0

Я попробовал MinGW (gcc 3.4.5 mingw-vista special r3) и скомпилировал простой источник C. но результат dumpbin показал зависимость __alloca: dumpbin/symbols test.obj ... 00C 00000000 UNDEF notype Внешние | __alloca ... Есть ли специальный вариант для mingw? – shkim

+0

Ах, извините. Это делает mingw.org gcc. TDM GCC 4.x mingw build выводит __chkstk. http://www.tdragon.net/recentgcc/ – andrewffff

+0

Спасибо. Я проверил TDM gcc всегда выдает __chkstk, но VC2008 выводит _chkstk на Release build и _alloca_probe на сборку Debug. Я думаю, что я должен отредактировать код, чтобы использовать локальные переменные под 4K. – shkim

3

Вы можете просто написать свою собственную процедуру _alloca и ссылку на нее. Посмотрите на источник библиотеки gcc, чтобы узнать, что он должен делать.

+0

Когда я реализовал _alloca в VS2008, я получил: ошибка C2169: «_alloca»: внутренняя функция, не может быть определена – shkim

+0

Я думаю, вы, вероятно, захотите реализовать свой собственный _alloca, используя gcc, а не Visual Studio. –

1

Похоже, что _alloca устарел от Microsoft и больше не находится в библиотеках их исполнения после VS2005. Более новые библиотеки времени выполнения поддерживают _malloca.

Ваши варианты выглядят не очень хорошо. Вместо этого вы можете попытаться построить VS2005. Возможно, у cygwin есть опция, в которой вы можете сказать, что используете более новую библиотеку времени исполнения (и если они еще не поддерживают ее, вы можете записать ее как запрос функции).

Смежные вопросы