2015-03-22 8 views
6

Sto tentando di trasferire il mio C++ library in g ++ utilizzando il rudimentale makefile (si compila bene in Visual Studio). La parte che sto cercando di compilare adesso misura circa 45000 righe di codice.Come diagnosticare l'errore g ++ "cc1plus.exe: memoria esaurita che alloca 838860800 byte" nel progetto di dimensioni moderate?

La libreria stessa compila OK, ma quando tento di includerlo in un'applicazione iterface console, il crash del compilatore con seguente messaggio e nient'altro:

cc1plus.exe: out of memory allocating 838860800 bytes 

Succede quando includo l'intestazione principale del progetto (che è generato dalla macchina e non è impegnato nel repository, vederlo here on Gist).

Ho pensato che è perché l'intestazione è troppo grande, ma ho notato che altri progetti hanno intestazioni omnicomprensive come questa e non soffrono di questi problemi. Ho provato a rimuovere tutti gli elementi non essenziali (fino a circa 1/3, il resto era necessario per l'applicazione da compilare) dall'intestazione e il problema perseverava. Ho anche notato che il numero nel messaggio di errore non è cambiato affatto, quindi credo che ci sia qualche problema singolare che causa l'errore, piuttosto che causato dal volume di codice.

C'è un uso di template molto piccolo oltre al solito STL e il codice che sto compilando non sembra essere notevole in alcun modo.

Sto usando g ++ 4.8.1 sotto mingw32 su Windows 8.1 x64 con 16 GB di RAM. Il codice è in fase di compilazione con -std=c++98.

Come individuare il codice che causa questo problema? g ++ non fornisce alcuna informazione diagnostica per suggerire la causa, anche con lo switch -v (here is what it returns).

+0

stai usando le intestazioni precompilate? –

+0

Cosa succede se rimuovi '#pragma once'? – wallyk

+2

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

risposta

10

Ciò accade quando si tenta di compilare un file codificato UTF-16 salvato in Windows con gcc. Cambia la codifica delle tue fonti in UTF-8. Vedi related CPP documentation.

+1

Grazie! L'intestazione principale è stata infatti scritta in UTF16 dallo script che utilizzo per generarlo. Chi avrebbe mai pensato che la codifica errata avrebbe causato l'allocazione di 800 MB di RAM da parte di GCC. –

Problemi correlati