CL.EXE (v8.00c) 编译文件时产生“内存不足”错误

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

我正在根据 这篇 CodeProject 文章 构建引导加载程序。可下载文件包含引导加载程序的源代码以及

CL.EXE
ML.EXE
LINK.EXE
的修补版本。

运行

CL.EXE
时显示:

Microsoft (R) C/C++ 优化编译器版本 8.00c

版权所有 (c) Microsoft Corp 1984-1993。保留所有权利。

bootmain.cpp

内存不足

%errorlevel%
返回值 2. 发生
Out of memory
错误时,文件未编译为目标文件。

注意:我使用的是 8.00c 版本的

CL.EXE
,它是 Visual C++ 1.52c 的一部分,它是可以生成 16 位可执行文件和二进制文件的 Visual C++ 编译器的最后一个版本。


如果我将

BootMain.cpp
减少到这个最小文件:

extern "C" void BootMain()
{
    return;
}

当我将其编译为目标文件时,我仍然收到

Out of Memory
错误:

.\VC152\CL.EXE /AT /G2 /Gs /Gx /c /Zl bootmain.cpp
c++ assembly visual-c++ compiler-errors bootloader
1个回答
1
投票

一些过时的工具无法处理长环境变量,例如

PATH
INCLUDE
,这在现代 Windows 开发环境中可能变得难以使用。您的
CL.EXE
恰好是 Win32 PE 可执行文件,因此甚至可以在 64 位 Windows 上作为 32 位应用程序运行。由于
CL.EXE
DOSBox 中为我工作,我不得不假设直接在 Windows 上运行时存在一些外部因素导致
Out of Memory
错误。我的第一个想法是环境变量,所以我将我的变量减少到最低限度。

作为实验,可以在开始时暂时将这些命令放入

BUILD.BAT
中,看看环境变量是否有问题:

set PATH=
set INCLUDE=

如果这解决了您的问题,您可能希望将这些行放在

BUILD.BAT
的顶部以保存旧的环境变量并使用空变量:

@set OLDINC=%INCLUDE%
@set OLDPATH=%PATH%
@set PATH=
@set INCLUDE=

要恢复这些环境变量,请将这些行放在末尾:

@set INCLUDE=%OLDINC%
@set PATH=%OLDPATH%
@set OLDINC=
@set OLDPATH=

其他

  • 如果您希望

    LINK.EXE
    停止提示您不必要的信息,请在链接器命令行末尾放置一个
    ;
    (分号)以强制其使用默认值。它看起来像:

    .\VC152\LINK.EXE /T /NOD StartPoint.obj bootmain.obj cdisplay.obj cstring.obj;
    
  • 批处理文件行开头的

    @
    会抑制命令回显到标准输出(即控制台)

© www.soinside.com 2019 - 2024. All rights reserved.