Как GCC компилировать без _alloca?

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

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

Но есть одна проблема: gcc всегда выделяет большой массив с помощью _alloca,

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

например,

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

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

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

Я попытался gcc вариант -fno-builtin-alloca или -fno-builtin, но не повезло.

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

4 ответа

Решение

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

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

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

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

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

Некоторые связанные обсуждения:

Другие вопросы по тегам