2016-05-31 61 views
5

Po aktualizacji Embarcadero C++ Builder do nowej wersji, nasz projekt nagle się nie buduje. Dzieje się tak tylko z jednym z naszych projektów. Dla większości członków zespołu identyczny kod jest tworzony bez błędów. Na moim komputerze łączenie kończy się niepowodzeniem."[ilink32] Fatal: brak pamięci" w C++ Builder

W zakładce budowy:

[ilink32] Fatal: Out of memory 

W zakładce Output:

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

Nie ma więcej informacji.

Po włączeniu Łącze z dynamicznym RTL, projekt łączy bezbłędnie. Na przykład, jeśli nasz cel debugowania ma włączone to ustawienie, projekt łączy w Debugowanie, ale nie w wersji.

Jak mogę rozwiązać ten problem? Jak mogę dać więcej pamięci dla linkera?

Odpowiedz

8

Wyjaśnienie

Na komputerze, jeden z hałd łącznikiem jest zbyt mała dla tego projektu. Projekt łączy się z linią Link z opcją Dynamic RTL, ponieważ w takim przypadku linker potrzebuje mniej pamięci, a sterty są wystarczająco duże.

Możesz użyć opcji linkera -GH, aby zwiększyć tę stertę, ale najpierw musisz dowiedzieć się, która przepełnienie sterty. Aby to zrobić, włącz wyjście diagnostyczne w linkerze.

Kompilacja z wyjściem diagnostycznym

Kompilacja z wiersza poleceń:

call rsvars 
MSBuild /v:diag YourProject.cbproj 

Kompilacja z IDE:

  • Idź do Narzędzia> Opcje Opcje> Środowisko
  • Zmień Gadatliwość do diagnostyczna
  • Po budowania projektu, odczytać dane wyjściowe z Output karcie Wiadomości okna

Wzrastające rozmiary sterty

Pod koniec wyjścia, należy znaleźć rozmiary z hałd, podobny do następującego:

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. 

W tym przypadku wystąpiło przepełnienie kupa tds, więc musimy zwiększyć jej rozmiar. Lewa kolumna podaje liczbę używanych bajtów, a prawa kolumna podaje liczbę przydzielonych bajtów. Nowy rozmiar powinien być większy niż wartość, która jest obecnie w prawej kolumnie.

W tym przypadku rozmiar tds był 0x09400000, więc zwiększamy go do 0x0f400000 z następującą opcją: -GHtds=0x0f400000.

W IDE przejdź do Projekt> Opcje> C++ Linker. Dodaj -GHtds=0x0f400000 do Zaawansowane> Dodatkowe opcje.

Po zapisaniu opcji projektu, należy ponownie skompilować projekt. Jeśli ta sama sterty przepełni się, musisz zwiększyć jej rozmiar jeszcze bardziej. Jeśli przepełnienie innego sterty, należy również zwiększyć jego rozmiar.

Na przykład, jeśli code sterty przelewa teraz i chcesz zwiększyć jej rozmiar do 0x0a000000, należy zmienić Dodatkowe opcje do -GHtds=0x0f400000 -GHcode=0x0a000000.

Więcej szczegółów

Nie ten problem został rozwiązany?

  • Jeśli używasz C++ Builder 10.0 lub 10.1, spróbować załatać swój łącznik jak opisano tutaj: LME288 Error in C++ Builder
  • Jeśli używasz C++ Builder 10.2, łatanie linker nie działa, ale można spróbować innych rozwiązań w tym samym linku: