2015-03-22 9 views
6

Ja próbuje portu mój C++ library do g ++ przy użyciu prymitywny makefile (kompiluje dobrze w Visual Studio). Część, którą próbuję teraz skompilować, mierzy około 45 000 linii kodu.Jak zdiagnozować błąd g ++ "cc1plus.exe: brak pamięci alokującej 838860800 bajtów" w projekcie o umiarkowanej wielkości?

Sama biblioteka kompiluje OK, ale gdy próbuję włączenie go do aplikacji iterface konsoli wywala kompilator z następujący komunikat i nic innego:

cc1plus.exe: out of memory allocating 838860800 bytes 

Zdarza się, kiedy to główny nagłówek projekt (który jest generowany maszynowo i nie jest zatwierdzony do repozytorium, patrz: here on Gist).

Pomyślałem, że to dlatego, że nagłówek jest zbyt duży, ale zauważyłem inne projekty wszechogarniająca nagłówków tak i nie cierpią z powodu tych problemów. Próbowałem rozebrać wszystkie nieistotne (do 1/3, reszta była niezbędna do kompilacji aplikacji) z nagłówka, a problem trwał. Zauważyłem też, że liczba w komunikacie o błędzie się nie zmieniła, więc uważam, że jest jakiś pojedynczy problem powodujący błąd, a nie jest spowodowany samą objętością kodu.

Niewiele jest wykorzystanie szablonu poza zwykłym STL oraz kod mam opracowującym nie wydają się być niezwykłe w jakikolwiek sposób.

używam g ++ 4.8.1 pod mingw32 Windows 8.1 x64 z 16 GB pamięci RAM. Kod jest kompilowany z -std=c++98.

Jak mogę znaleźć kod, który jest przyczyną tego problemu? g ++ nie dostarcza mi żadnych informacji diagnostycznych sugerujących przyczynę, nawet z przełącznikiem -v (here is what it returns).

+0

używasz prekompilowanych nagłówków? –

+0

Co stanie się, jeśli usuniesz '#pragma once'? – wallyk

+2

inny wpis: http://stackoverflow.com/questions/27588296/running-gcc-on-c-source-file-on-linux-gives-cc1plus-out-of-memory-allocati – Salmonstrikes

Odpowiedz

10

To się dzieje przy próbie kompilacji pliku UTF-16 zakodowany zapisaną w systemie Windows z gcc. Zmień kodowanie źródeł na UTF-8. Zobacz related CPP documentation.

+1

Dzięki! Główny nagłówek został rzeczywiście napisany w UTF16 przez skrypt, którego używam do jego wygenerowania. Kto by pomyślał, że nieprawidłowe kodowanie spowoduje, że GCC przydzieli 800 MB pamięci RAM. –

Powiązane problemy