2010-02-27 11 views
5

Z jakiegoś powodu powinienem użyć gcc do kompilacji pliku C, a następnie połączyć się z projektem Visual C++ 2008.Jak skompilować GCC bez _alloca?

(użyłem aktualną wersję gcc: najnowsze cygwin gcc 4.3.4 20090804.)

Ale jest jeden problem: gcc zawsze przeznaczyć dużą tablicę z _alloca,

i VC linker nie może rozwiąż symbol __alloca.

np

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

ten kod sprawia, że ​​zależność _alloca choć nie wywołać funkcję _alloca wyraźnie.

(Sprawy rozmiar tablicy, jeśli zmienię 10240 -.> 128, wszystko ok)

Próbowałem opcji gcc -fno-wbudowanym-alloca lub -fno-wbudowanego polecenia, ale bez powodzenia.

Czy można uniemożliwić korzystanie z GCC _alloca? (lub dostosować próg?)

+0

Dlaczego nie wystarczy użyć 'malloc()' jawnie? –

+0

Nie jest to moje pisane źródło i nieco skomplikowane do edycji. a może oryginalny autor nie chciał kary, by nazwać malloc. – shkim

+1

Celem alloca w tym przypadku jest upewnienie się, że stos jest wystarczająco duży, aby pomieścić tę tablicę. Kompilator Microsoft nie potrzebuje alloca; emituje ten kod sondy stosu bezpośrednio do funkcji. Sonda stosu nie jest potrzebna, gdy mieszkańcy są niewielcy. Co się stanie, jeśli nie użyjesz -ofno-builtin-alloca i -fno-builtin? –

Odpowiedz

7

Najlepiej byłoby skompilować cały kod za pomocą VC++. Jeśli to nie jest możliwe ..

Powinieneś użyć gcc mingw zamiast cygwin. Jest przeznaczony do wyprowadzania kodu, który będzie połączony z runtime VC++, a nie z bibliotekami cygwin. W szczególności wywoła funkcję wykonawczą VC++ __chkstk zamiast __alloca.

+0

Próbowałem MinGW (gcc 3.4.5 mingw-vista specjalne r3) i skompilowałem proste źródło C. ale wynik dumpbin pokazał zależność __alloca: dumpbin/symbols test.obj ... 00C 00000000 UNDEF notype External | __alloca ... Czy istnieje specjalna opcja dla mingw? – shkim

+0

Ah, przepraszam. Robi to mingw.org gcc. TDM GCC 4.x mingw buduje wyjścia __chkstk. http://www.tdragon.net/recentgcc/ – andrewffff

+0

Dziękuję. Sprawdziłem TDM gcc zawsze wyświetla __chkstk, ale VC2008 wypisuje _chkstk na wersji Release i _alloca_probe na kompilacji Debugowania. Myślę, że powinienem edytować kod, by używać lokalnych Varaibles w 4K. – shkim

3

Możesz napisać własną procedurę _alloca i połączyć się z nią. Sprawdź źródło biblioteki gcc, aby zobaczyć, co ma robić.

+0

Kiedy zaimplementowałem _alloca w VS2008, otrzymałem: błąd C2169: '_alloca': funkcja wewnętrzna, nie można zdefiniować – shkim

+0

Myślę, że prawdopodobnie chciałbyś zaimplementować niestandardową _alloca za pomocą gcc zamiast Visual Studio. –

1

Wygląda na to, że _alloca został wycofany przez firmę Microsoft i nie jest już w bibliotekach uruchomieniowych po VS2005. Nowsze biblioteki uruchomieniowe obsługują _malloca.

Twoje opcje nie wyglądają dobrze. Zamiast tego możesz spróbować zbudować za pomocą VS2005. Być może cygwin ma opcję, w której możesz powiedzieć, że używasz nowszej biblioteki środowiska wykonawczego (a jeśli jeszcze tego nie obsługują, możesz złożyć ją jako żądanie funkcji).

Powiązane problemy