"[ilink32] Fatal: out of memory " в C++ Builder

после обновления Embarcadero C++ Builder до новой версии наш проект внезапно не удается построить. Это происходит только с одним из наших проектов. Для большинства членов команды идентичный код строится без ошибок. На моем компьютере, linking терпит неудачу каждый раз.

На вкладке сборки:

[ilink32] Fatal: Out of memory

На вкладке output:

Build FAILED.
c:program files (x86)embarcaderostudio.0BinCodeGear.Cpp.Targets(3517,5): error : Fatal: Out of memory

больше нет информации.

Если я включу связь с динамическим RTL проект ссылки без ошибок. Например, если в нашей цели отладки этот параметр включен, проект связывается в Debug, но не в Release.

Как я могу исправить эту проблему? Как я могу дать больше памяти для линкера?

1 ответов


объяснение

на вашем компьютере одна из куч компоновщика слишком мала для этого проекта. Проект связан с связь с динамическим RTL опция, потому что в этом случае компоновщику требуется меньше памяти, и куча просто оказывается достаточно большой.

можно использовать -GH опция компоновщика для увеличения этой кучи, но сначала вы должны узнать, какая куча переполняется. Для этого включите диагностический вывод в компоновщике.

компиляция с диагностический выход

компиляция из командной строки:

call rsvars
MSBuild /v:diag YourProject.cbproj

компиляция из IDE:

  • на Инструменты > Параметры > Параметры Среды
  • изменить многословие до Диагностика
  • после создания проекта прочитайте вывод из выход на сообщения окно

увеличение кучи размеры

в конце вывода вы должны найти размеры куч, похожие на это:

The "ILINK32" task is using "ilink32" from "c:\program files (x86)\embarcadero\studio.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.0\Bin\CodeGear.Cpp.Targets(3517,5): error : Fatal: Out of memory
The command exited with code 2.

в этом случае, переполнение произошло в кучи tds, поэтому нам нужно увеличить его размер. В левом столбце указано количество используемых байтов, а в правом-количество выделенных байтов. Новый размер должен быть больше значения, которое в данный момент находится в правом столбце.

в этом случае tds размер 0x09400000, поэтому мы увеличиваем его до 0x0f400000 со следующей опцией:-GHtds=0x0f400000.

в IDE перейдите в Проект > Параметры > Компоновщик C++. Добавить -GHtds=0x0f400000 to Дополнительно > Дополнительные Параметры.

после сохранения параметров проекта, снова скомпилировать проект. Если же куча переполняется, нужно увеличить ее размер еще больше. Если другая куча переполняется, вам также необходимо увеличить ее размер.

, если code куча переполняется сейчас, и вы хотите увеличить ее размер к 0x0a000000, вы должны изменить Дополнительные Опции до -GHtds=0x0f400000 -GHcode=0x0a000000.

если вы увеличите кучу слишком много, вы получите ошибку LME288 вместо этого. Это означает, что вы достигли максимального размера для некоторой кучи. Если даже максимального размера недостаточно для вашего проекта, кажется, C++ Builder 10.2.3. удвоил максимальный размер, поэтому вы можете перейти на эту версию или скопировать ilink32.exe из 10.2.3. установка для использования со старой версией C++ Builder.

больше подробности

разве это не исправило проблему?

  • если вы используете C++ Builder 10.0 или 10.1, попробуйте исправить компоновщик, как описано здесь:ошибка LME288 в C++ Builder
  • если вы используете C++ Builder 10.2, исправление компоновщика не работает, но вы можете попробовать другие решения по той же ссылке
  • C++ Builder 10.2. имеет настройки для управления кучами: обработка ошибок из памяти