C++ Builder 中的“[ilink32] 致命:内存不足”
"[ilink32] Fatal: Out of memory" in C++ Builder
将Embarcadero C++ Builder更新到新版本后,我们的项目突然无法构建。这仅发生在我们的一个项目中。对于大多数团队成员来说,相同的代码构建没有错误。在我的电脑上,每次都链接失败。
在构建选项卡中:
[ilink32] Fatal: Out of memory
在“输出”选项卡中:
Build FAILED.
c:\program files (x86)\embarcadero\studio.0\Bin\CodeGear.Cpp.Targets(3517,5): error : Fatal: Out of memory
没有更多信息。
如果我启用 Link 和动态 RTL,项目链接没有错误。例如,如果我们的 Debug 目标启用了该设置,则项目链接在 Debug 中而不是 Release 中。
我该如何解决这个问题?如何为链接器提供更多内存?
说明
在您的计算机上,其中一个 linker 堆对于这个项目来说太小了。带有 Link 和 Dynamic RTL 选项的项目 links,因为在那种情况下 linker 需要更少的内存,而堆正好足够大。
您可以使用 -GH
linker 选项来增加该堆,但首先您必须找出哪个堆溢出。为此,请在 linker.
中启用诊断输出
使用诊断输出进行编译
从命令行编译:
call rsvars
MSBuild /v:diag YourProject.cbproj
从 IDE 编译:
- 转到工具 > 选项 > 环境选项
- 将冗长更改为诊断
- 构建项目后,从 Messages window
的 Output 选项卡读取输出
增加堆大小
接近输出的末尾,您应该找到堆的大小,类似于:
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++ Linker。将 -GHtds=0x0f400000
添加到 高级 > 其他选项。
保存项目选项后,再次编译项目。如果同一个堆溢出,则需要进一步增加其大小。如果另一个堆溢出,您也需要增加它的大小。
例如,如果 code
堆现在溢出,而您想将其大小增加到 0x0a000000
,您应该将 Additional Options 更改为 -GHtds=0x0f400000 -GHcode=0x0a000000
.
如果堆增加太多,则会出现 LME288 错误。这意味着您已达到某些堆的最大大小。如果即使是最大尺寸也不能满足您的项目需求,C++ Builder 10.2.3 似乎是可行的。已将最大大小翻倍,因此您可以迁移到该版本,或从 10.2.3 复制 ilink32.exe
。安装以与旧版本的 C++ Builder 一起使用。
更多详情
- How to report a C++ Compiler or Linker problem and workarounds
- "Unable to perform link" error when compiling in RAD Studio XE8
这还没有解决问题吗?
- 如果您使用的是 C++ Builder 10.0 或 10.1,请尝试按照此处所述修补您的 linker:
- 如果您使用的是 C++ Builder 10.2,修补 linker 不起作用,但您可以在相同 link
中尝试其他解决方案
- C++ 生成器 10.2。具有管理堆的设置:Handling Out of Memory Errors
tds 大小取决于调试信息。如果您想查看内存错误,只需安装所有组件(Devexpress、Fastreport 等)...使用 debuginfo。我因内存错误而浪费了几天时间,但没有结果。在没有 debuginfo 的情况下重新安装所有附加组件后,每个项目都开始编译、链接、调试,没有错误 - tds 文件的大小从 90MB 减少到 34MB。
将Embarcadero C++ Builder更新到新版本后,我们的项目突然无法构建。这仅发生在我们的一个项目中。对于大多数团队成员来说,相同的代码构建没有错误。在我的电脑上,每次都链接失败。
在构建选项卡中:
[ilink32] Fatal: Out of memory
在“输出”选项卡中:
Build FAILED.
c:\program files (x86)\embarcadero\studio.0\Bin\CodeGear.Cpp.Targets(3517,5): error : Fatal: Out of memory
没有更多信息。
如果我启用 Link 和动态 RTL,项目链接没有错误。例如,如果我们的 Debug 目标启用了该设置,则项目链接在 Debug 中而不是 Release 中。
我该如何解决这个问题?如何为链接器提供更多内存?
说明
在您的计算机上,其中一个 linker 堆对于这个项目来说太小了。带有 Link 和 Dynamic RTL 选项的项目 links,因为在那种情况下 linker 需要更少的内存,而堆正好足够大。
您可以使用 -GH
linker 选项来增加该堆,但首先您必须找出哪个堆溢出。为此,请在 linker.
使用诊断输出进行编译
从命令行编译:
call rsvars
MSBuild /v:diag YourProject.cbproj
从 IDE 编译:
- 转到工具 > 选项 > 环境选项
- 将冗长更改为诊断
- 构建项目后,从 Messages window 的 Output 选项卡读取输出
增加堆大小
接近输出的末尾,您应该找到堆的大小,类似于:
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++ Linker。将 -GHtds=0x0f400000
添加到 高级 > 其他选项。
保存项目选项后,再次编译项目。如果同一个堆溢出,则需要进一步增加其大小。如果另一个堆溢出,您也需要增加它的大小。
例如,如果 code
堆现在溢出,而您想将其大小增加到 0x0a000000
,您应该将 Additional Options 更改为 -GHtds=0x0f400000 -GHcode=0x0a000000
.
如果堆增加太多,则会出现 LME288 错误。这意味着您已达到某些堆的最大大小。如果即使是最大尺寸也不能满足您的项目需求,C++ Builder 10.2.3 似乎是可行的。已将最大大小翻倍,因此您可以迁移到该版本,或从 10.2.3 复制 ilink32.exe
。安装以与旧版本的 C++ Builder 一起使用。
更多详情
- How to report a C++ Compiler or Linker problem and workarounds
- "Unable to perform link" error when compiling in RAD Studio XE8
这还没有解决问题吗?
- 如果您使用的是 C++ Builder 10.0 或 10.1,请尝试按照此处所述修补您的 linker:
- 如果您使用的是 C++ Builder 10.2,修补 linker 不起作用,但您可以在相同 link 中尝试其他解决方案
- C++ 生成器 10.2。具有管理堆的设置:Handling Out of Memory Errors
tds 大小取决于调试信息。如果您想查看内存错误,只需安装所有组件(Devexpress、Fastreport 等)...使用 debuginfo。我因内存错误而浪费了几天时间,但没有结果。在没有 debuginfo 的情况下重新安装所有附加组件后,每个项目都开始编译、链接、调试,没有错误 - tds 文件的大小从 90MB 减少到 34MB。