如何修复 "LME288/Unknown heap name" 警告?

How to fix "LME288/Unknown heap name" warning?

突然间,我收到 LME288 链接器错误。

[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ilc: 0x00010000 / 0x08000000
[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ild: 0x00010000 / 0x08000000
[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ilf: 0x00010000 / 0x0a000000
[ilink32 Warning] Warning: D:/Projects/TrainFever Game Manager/TFGM/Win32/Debug/TFGameManager.ils: 0x0003b000 / 0x08000000
[ilink32 Warning] Warning: unknown heap name   : 0x08000000 / 0x08000000
[ilink32 Warning] Warning: Error detected (LME288)
[ilink32 Error] Error: Unable to perform link

我没有安装 AV,该项目已经 运行 一年多了。我试过:

here之前有人问过这个问题,但没有提出真正的解释或解决方案。

我还能做些什么来解决这个问题?

编辑
我试图重建几个多年来一直 运行 正常的其他项目,现在我的所有项目都出现 LME288 错误。

我找到了一个似乎有效的解决方法。

这似乎与损坏的临时文件有关。我在我的系统磁盘上做了 "Disk Cleanup" 之后,我设法让它再次工作。

我删除了列表中的所有文件(选中所有复选框)以及 "Clean up system files"

之后我可以编译 link,甚至无需重新启动。 甚至增量 link 又开始工作了!

我有一个不同的解决方案,希望能帮助遇到这个问题的人。

我尝试了所有方法,none 之前建议的解决方案对我有用。磁盘清理没有帮助。这显然是 C++Builder 中存在多年的错误,即使在 2015 年的 XE8 中也仍未修复。

幸运的是,我有另一台有工作环境的电脑,同样的项目在那里编译。我将输出目录 (Win32/Debug) 中的所有文件(*.exe、*.obj 等)从那台计算机复制到我遇到问题的那台计算机上,然后神奇地直接设置了 C++ Builder;之后的所有构建都开始工作。

只是 运行 XE8 作为管理员为我修复了它。

我在 Windows 10 上安装 RAD Studio XE8 时也遇到了这个问题。当安装在 Windows 7 (x86) 上时,RAD Studio XE8 工作正常。

升级到 Windows 10 (x86) 后,我 运行 进入可怕的未知堆 LME288 错误。起初它没有出现在 Windows 10 上,但如果我安装了一些东西,它就会弹出。如果我把电脑恢复到Windows7,它就会消失。

在网上稍作研究后,我找到了解决方案。 ilink32.exe 存在内存问题,您需要在计算机启动时启用 3GB 内存 space。如果此错误再次出现,我现在要做的是:

  1. 运行 作为管理员的命令提示符。
  2. 类型(不带引号)"bcdedit /set IncreaseUserVa 3072"
  3. 重启电脑。

完成后,ilink32 正常工作。

我发现安装更新版本的Acronis True Image (2016) 后,LME288 错误又回来了。但是 运行 这里的 bcdedit 解决方案,它修复了 RAD Studio XE8 链接器!!!

就我而言,尝试这里提到的所有其他选项根本不起作用。

我的 Windows 10 机器的系统设置中,手动设置虚拟内存量似乎是个窍门。它被设置为由操作系统自动管理,但将其更改为手动值(即使最小值小于自动分配的值,并且它是实际使用的值)使链接器再次工作。

在我的例子中,OS 分配了大约 1,600 Mb。我将最小值设置为 1,024,将最大值设置为 3,072,重新启动,现在链接器工作正常。使用的数量是 1,024(即使推荐值是 ~1,900)。

as我运行升级到Windows10(x64)后出现LME288错误。

ilink32.exe 更改 数据执行保护设置 时错误消失了:

  • 系统属性 -> 高级系统设置 -> 性能 -> 设置 -> 数据执行保护
  • 为除我 select -> ilink32.exe.
  • 之外的所有程序和服务启用 DEP

2020 年 1 月 15 日,Embarcadero 将 RSP-12869 的状态从 "Needs feedback" 更改为 "Open" 并将其分配给 Internal Dev.

更早的历史: 随着 2017 年 4 月 C++ Builder 10.2 Tokyo 版本的发布,Embarcadero 升级了链接器,声称解决了问题:"The linker is now large address aware and can address up to 4GB on a 64-bit system, twice the previous amount. (Some customers hacked the linker to be LAE [sic] in the past by toggling the bit in the PE header; since the code wasn't written to be LAE-aware this hack prevented incremental linking and sometimes other functionality from functioning correctly.)" https://community.embarcadero.com/blogs/entry/what-s-new-in-c-builder-10-2-part-1-the-linker

然而,2017年5月24日,Ashleigh Quick报告10.2 Tokyo的链接器仍然没有解决问题: RSP-12869。同样,@Ultralisk 在 2020-01-09 的下方评论中报告了同样的问题。

这是一种解决方法:从 10.2 Tokyo 开始,您可以使用一些新选项来控制 LARGEADDRESSAWARE 和链接器堆大小。 Dieter Woellner reported on 26-Oct-2017 暂时设置 C++-Linker |进阶 | “-GF:LARGEADDRESSAWARE”的高级选项条目消除了这个问题。但是问题又来了,他发现如果将 TDS Heapsize 设置为低于 0x08000000 的值,则可以避免 error/crash 链接……暂时。

=====================================

我是那些将链接器破解为 LAA 的客户之一,从而干扰了增量链接(我不需要)并解决了我的问题。如果您不需要增量链接,请继续阅读。

=====================================

我通过在 ilink32.exe 中设置 /LARGEADDRESSAWARE 标志解决了这个问题。原来的解决方案来自 Hiroyuki Shimada,使用 editbin,并于 2016 年 1 月 12 日在 http://qc.embarcadero.com/wc/qcmain.aspx?d=134775 编辑 post。他还将其应用于bcc32.exe;我不需要。

作为一项 public 服务,我在此处 post 编辑了我的补丁 ilink32.exe 版本:

要使用其中任何一个,请在 RAD Studio 二进制文件目录中重命名 ilink32.exe(例如,C:\Program Files (x86)\Embarcadero\Studio.0\bin 用于 RAD Studio Seattle,或 ....0\bin 用于 Berlin),然后将我的复制到它的位置, 将其重命名为 ilink32.exe.

[注意:这些 /LAA 链接器解决了很多但不是所有用户的问题; 2016 年 7 月 25 日在 https://quality.embarcadero.com/browse/RSP-13247]

查看@Andrew Legget 的 post

这个问题已经存在很长时间了,并不局限于 XE3、XE5、XE7、XE8...现在在 https://quality.embarcadero.com/browse/RSP-13247 有一个冗长的 discussion/lament 为什么会这样在 RAD Studio 的一个版本中修复,但在更高版本中退出;显然是 /LAA "resulted in failures when linking incrementally with the static RTL"。根据 Dennis Jones 在该线程中的 28/Mar/16 12:14 PM post,/LAA 补丁未解决其他链接器错误 "EXE1825" 或 "out of memory" .

如果您想了解可以修补 ilink32.exe 的三种方式,请阅读下文...


  1. 使用 lamarker 工具设置大地址感知标志,可从以下网址下载:http://cc.embarcadero.com/Item/30459(感谢 Doug Hay,https://quality.embarcadero.com/browse/RSP-13247 中的 19/Jul/16 post):

    lamarker -M -Filink32.exe

(您可以直接在您的 C:\Program Files (x86)\Embarcadero\Studio.0\bin(或 ....0\bin)目录中执行此操作;它将把原来的 ilink32.exe 重命名为 ilink32.exe.old -- 如果您有权限)

--或--

  1. 使用 MS Visual Studio 中的 editbin,如果您已经安装了此类软件(Microsoft 声称 editbin 必须运行 来自 IDE)。作为准备步骤,复制 bcc32.exeilink32.exe 以防止 UAC 被阻止(并备份它们)

    copy "C:\Program Files (x86)\Embarcadero\RAD Studio.0\bin\bcc32.exe" .

    copy "C:\Program Files (x86)\Embarcadero\RAD Studio.0\bin\ilink32.exe" .

    editbin /LARGEADDRESSAWARE bcc32.exe

    editbin /LARGEADDRESSAWARE ilink32.exe

-- 或--

  1. 使用 masm32 包中的 editbin 设置大地址感知标志:

http://www.masm32.com/download.htm 下载,创建 c:\masm32\bin\editbin.exe。我在 MASM32 安装期间收到了一些警告(涉及序数 201 和 203),但它的 self-test 通过了,我只需要 editbin.exe.

我通过确保从所有防病毒扫描中排除 Embarcadero 安装文件夹(例如 C:\Program Files (x86)\Embarcadero)来修复此问题。

已修复 XE10 和 Windows10 (x64) 与 Bitdefender IS 2016:

Bitdefender -> 模块 -> 防病毒 -> 排除 -> 排除的进程 -> 添加“...\bin\ilink32.exe” -> 允许

重启 W10 解决了 XE5 上的这个问题 但我正在停用增量构建

解决方法很简单:windows PATH 环境变量超过了 2047 字节的限制。

请看我的描述: http://blog.bitart.at/lme288/[德语]

编辑:我的 "solution" 只持续了几个月。安装 Microsoft Visual Studio 后又出现问题。

如另一个答案中所述:用

修补 ilink32.exe

lamarker -M -Filink32.exe

似乎是正确的解决方案。

Windows 10(x64),Rad Studio XE Berlin(启用增量 link)。

我通过排除解决了问题 “C:\Program Files (x86)\Embarcadero\bin”来自防病毒 Window Defender 扫描。

使用 BDSSetLang.exe 将 IDE 语言从法语更改为英语 为我解决了 LME288 错误!

似乎使用 10.2.3 提供的链接器,TDS 堆大小可以设置为 0x1FF00000。在新旧版本中,这个最大值更小(给出 LME200)。如果您需要较大的堆大小,我建议使用 10.2.3 的链接器。我还打开了一个关于这个的错误报告:RSP-27205

对我来说似乎是绝对随机的...我也遇到了“未知堆名称”故障。我尝试了很多上面的解决方案,其中 none 行得通。我尝试了 circlepi314 的 ilink,尝试清理临时文件、多次重启等。 在 Embarcadero 的链接器失败页面上,我发现来自 dll 的调用约定可能会导致问题。我的项目确实包含对 dll 的调用。 我排除了这些调用,编译并再次链接,没有任何问题。 在那之后,我再次包含了这些调用,它也没有任何问题地链接了。尽管我什至在两者之间清理了项目。我什至不能再复制它了。 一定有一些残基被链接器使用,现在已经消失了。 所以希望这对将来的人有所帮助。

在我的情况下,它是 Avast Antivirus - 我将其关闭并且链接有效

我 运行 遇到了与 10.4 相同的问题。 ilink32 在安装后的第一次编译时发出一长串警告。我检查了 linker 选项中的大地址感知 (LARGEADDRESSAWARE) 标志,它已经设置。然后我将 TDS 堆大小设置为低于 0x08000000 的值(我使用 0x07FFFFFF)并进行了重建。至此,link彻底失败。然后我将 TDS 堆大小重置为默认值 0 并重建,此时所有 ilink32 警告都被消除并且 link 完全干净。

我怀疑除非明确设置,否则不会从配置中读取 TDS 堆大小值。我怀疑在默认零上输入零是否有效,因为 IDE 可能看不到值的变化,所以我建议设置为零以外的某个值,构建,然后设置回零并重建。

很难相信你们都有一个项目需要增加堆大小...我所有的 LME200 LME288 和其他内存不足错误在重新安装所有附加组件后肯定消失了(Fastreport/Devexpress 等.) 没有调试信息。之后的 TDS 文件大小缩小了 3 倍,链接器和调试器的工作方式与 Embarcadero 使用一个表单应用程序测试的完全一样 - 不再出现疯狂错误。