2016-05-31 14 views
5

Dopo l'aggiornamento di Embarcadero C++ Builder a una nuova versione, il nostro progetto improvvisamente non riesce a creare. Questo succede solo con uno dei nostri progetti. Per la maggior parte dei membri del team, il codice identico si costruisce senza errori. Sul mio computer, il collegamento fallisce ogni volta."[ilink32] Fatal: Memoria insufficiente" in C++ Builder

In scheda Costruisci:

[ilink32] Fatal: Out of memory 

In scheda Output:

Build FAILED. 
c:\program files (x86)\embarcadero\studio\18.0\Bin\CodeGear.Cpp.Targets(3517,5): error : Fatal: Out of memory 

Non ci sono ulteriori informazioni.

Se si abilita il collegamento con RTL dinamico, i collegamenti del progetto sono senza errori. Ad esempio, se il nostro target di Debug ha quell'impostazione abilitata, il progetto si collega in Debug ma non in Release.

Come posso risolvere questo problema? Come posso dare più memoria per il linker?

risposta

8

Spiegazione

Sul computer, uno dei cumuli linker è troppo piccolo per questo progetto. Il progetto si collega con Link con l'opzione Dynamic RTL, perché in tal caso il linker ha bisogno di meno memoria e l'heap sembra essere abbastanza grande.

È possibile utilizzare l'opzione di collegamento -GH per aumentare tale heap, ma prima è necessario scoprire quale heap trabocca. Per fare ciò, abilitare l'output diagnostico nel linker.

compilazione con uscita diagnostica

compilazione dalla riga di comando:

call rsvars 
MSBuild /v:diag YourProject.cbproj 

Compilare l'IDE:

  • Vai Strumenti> Opzioni Opzioni> Ambiente
  • Cambia Verbosity a diagnostica
  • Dopo aver costruito il progetto, leggere uscita dal scheda uscita dei messaggi finestra

aumentare le dimensioni heap

Verso la fine della produzione, si dovrebbe trovare formati di heap, simile a questo:

The "ILINK32" task is using "ilink32" from "c:\program files (x86)\embarcadero\studio\18.0\bin\ilink32.exe". 
Turbo Incremental Link 6.75 Copyright (c) 1997-2016 Embarcadero Technologies, Inc. 
Overrun on linker heap: tds 
Linker Heaps 
------------ 
system     0x030d4000 0x08000000 
tds     0x08710000 0x09400000 
c:\program files (x86)\embarcadero\studio\18.0\Bin\CodeGear.Cpp.Targets(3517,5): error : Fatal: Out of memory 
The command exited with code 2. 

In questo caso, l'overflow è avvenuto in heap tds, quindi abbiamo bisogno di aumentare le sue dimensioni. La colonna sinistra indica il numero di byte in uso e la colonna destra indica il numero di byte allocati. La nuova dimensione dovrebbe essere maggiore del valore che è attualmente nella colonna di destra.

In questo caso, la dimensione tds era 0x09400000, quindi la aumentiamo a 0x0f400000 con la seguente opzione: -GHtds=0x0f400000.

Nell'IDE, andare a Progetto> Opzioni> Linker C++. Aggiungi -GHtds=0x0f400000 a Avanzate> Opzioni aggiuntive.

Dopo aver salvato le opzioni di progetto, compilare nuovamente il progetto. Se lo stesso heap fuoriesce, è necessario aumentarne ulteriormente le dimensioni. Se un altro heap trabocca, è necessario aumentare anche le sue dimensioni.

Per esempio, se code mucchio trabocca ormai, e si vuole aumentare le sue dimensioni a 0x0a000000, si dovrebbe cambiare Opzioni aggiuntive--GHtds=0x0f400000 -GHcode=0x0a000000.

Maggiori dettagli

Fatto questo non risolve il problema?

  • Se si utilizza C++ Builder 10.0 o 10.1, provate a patchare il linker come descritto qui: LME288 Error in C++ Builder
  • Se si utilizza C++ Builder 10.2, l'applicazione di patch il linker non funziona, ma si può provare altre soluzioni nello stesso link
Problemi correlati