Как 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 есть опция, с помощью которой вы можете сказать, что используете более новую библиотеку времени выполнения (и если они еще не поддерживают ее, вы можете подать ее как запрос функции).
Некоторые связанные обсуждения: