C++ Builder 中的“[ilink32] 致命:内存不足”

问题描述 投票:0回答:3

将 Embarcadero C++ Builder 更新到新版本后,我们的项目突然无法构建。这种情况只发生在我们的一个项目中。对于大多数团队成员来说,构建相同的代码不会出现错误。在我的电脑上,每次都链接失败。

在“构建”选项卡中:

[ilink32] Fatal: Out of memory

在“输出”选项卡中:

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

没有更多信息。

如果我启用使用动态 RTL 链接,项目链接不会出现错误。例如,如果我们的调试目标启用了该设置,则项目会在“调试”中链接,但不会在“发布”中链接。

如何解决这个问题?如何为链接器提供更多内存?

c++ out-of-memory linker-errors c++builder
3个回答
13
投票

说明

在您的计算机上,其中一个链接器堆对于该项目来说太小。该项目使用 Link with Dynamic RTL 选项进行链接,因为在这种情况下,链接器需要较少的内存,并且堆恰好足够大。

您可以使用

-GH
链接器选项来增加该堆,但首先您必须找出哪个堆溢出。为此,请在链接器中启用诊断输出。

使用诊断输出进行编译

从命令行编译:

call rsvars
MSBuild /v:diag YourProject.cbproj

从 IDE 编译:

  • 转到工具 > 选项 > IDE > 编译和运行
      旧版本 C++ Builder 中的
    • 工具 > 选项 > 环境选项
  • 详细程度更改为诊断
  • 构建项目后,从
  • Messages窗口的Output选项卡读取输出
增加堆大小

在输出末尾附近,您应该找到堆的大小,与此类似:

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.
在这种情况下,堆

tds

发生了溢出,所以我们需要增加它的大小。左列给出正在使用的字节数,右列给出分配的字节数。新尺寸应大于右列中当前的值。

在本例中,

tds

 大小为 
0x09400000
,因此我们使用以下选项将其增加到 
0x0f400000
-GHtds=0x0f400000

在 IDE 中,转到

项目 > 选项 > C++ 链接器。将 -GHtds=0x0f400000

 添加到 
高级 > 其他选项

如果您使用的是 C++ Builder 10.2。或更新版本,您不需要使用命令行选项。您只需在同一设置页面上将

TDS 堆大小 设置为 0x0f400000

保存工程选项后,再次编译工程。如果同一个堆溢出,则需要进一步增加其大小。如果另一个堆溢出,您也需要增加它的大小。

例如,如果

code

 堆现在溢出,并且您想将其大小增加到 
0x0a000000
,则应将 
附加选项 更改为 -GHtds=0x0f400000 -GHcode=0x0a000000

可能出现的问题

如果堆增加太多,则会出现 LME288 错误。这意味着您已达到某些堆的最大大小。如果最大大小还不足以满足您的项目,那么 C++ Builder 10.2.3 似乎是最佳选择。最大大小增加了一倍,因此您可以迁移到该版本,或从 10.2.3 复制

ilink32.exe

。安装以与旧版本的 C++ Builder 一起使用。

如果这些设置不起作用,并且您使用的是 C++ Builder 10.0 或 10.1,请尝试按照此处所述修补链接器:

C++ Builder 中的 LME288 错误。使用 C++ Builder 10.2 及更高版本,不需要修补链接器。

更多详情

  • 如何报告 C++ 编译器或链接器问题和解决方法
  • 在 RAD Studio XE8 中编译时出现“无法执行链接”错误
  • 处理内存不足错误

1
投票
当前使用C++ Builder 11.2, 对于调试构建,ilink64 内存不足,而对于发布构建则正常。 转到项目选项 > C++ 编译器 > 优化

调试通常使用“禁用所有优化”,考虑到内存不足的问题,改为使用“生成尽可能小的代码”,然后ilink64成功。

在下面尝试过,它不适用于我的情况

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Handling_Linker_Out_of_Memory_Errors


0
投票
tds 大小取决于 debuginfo。如果您想查看内存错误,只需安装所有组件(Devexpress、Fastreport 等)...以及 debuginfo。由于记忆错误,我损失了好几天,但没有任何结果。在没有 debuginfo 的情况下重新安装所有附加组件后,每个项目都开始编译、链接、调试,没有错误 - tds 文件的大小从 90MB 减少到 34MB。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.