我正在根据 这篇 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
一些过时的工具无法处理长环境变量,例如
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;
批处理文件行开头的
@
会抑制命令回显到标准输出(即控制台)