Visual Studio 2010 - MS C++ (CL) 编译的可执行文件在 Windows 2000 上不起作

visual studio 2010 - MS C++ (CL) compiled executable does not work on Windows 2000

本文关键字:Windows 可执行文件 2000 编译 2010 Studio MS C++ CL Visual      更新时间:2023-10-16

可能的重复项:
在 Windows 2000 中使用C++ DLL 编译的 Visual Studio 2010 时出现问题

类似于这些问题:
 我可以将Visual Studio 2010的C++编译器与Visual Studio 2008的C++运行时库一起使用吗?
 VS2010可以在Windows 2000下创建本机可执行文件吗?


我有C++代码,我在 WinXP 机器上使用 VS2010(CL 版本 16.00.30319.0)从命令行(使用 CL.EXE)编译,但我希望生成的本机 (x86) 可执行程序在 Win2000、WinXP 等上运行。

旧版本的 CL(VC98,版本 12.00.8186)可以很好地完成这项工作,但 VS2010 版本会生成一个可执行文件,当在 Win2000 上运行时,会导致弹出错误:

foo.exe 不是有效的 Win32 应用程序

解决方案必须采用 CL 编译器或链接器选项的形式,而不是 VisualStudio 设置或属性。我不需要任何较新的C++语言功能,因为代码已有几年的历史,并且编写为可移植到其他操作系统,并且我只想要本机代码(x86,而不是.NET或CLI)可执行文件。

(有关示例,请参阅 http://david.tribble.com/src/crlf.cpp 和 http://david.tribble.com/src/detab.cpp。

我想我可以在我的新开发环境(WinXP,最终是Windows 7)上继续使用较旧的编译器(VS 9.0),但这似乎是一个不太理想的解决方案。当然,MS 仍然提供了一种创建向后兼容较旧但仍然存在的 Windows 操作系统的本机可执行文件的方法吗?

您的错误"foo.exe不是有效的Win32应用程序"可以通过使用editbin将PE标头中的"最低操作系统版本"字段设置为0x0500(Windows 2000)来修复。

EDITBIN /VERSION:5,0 foo.exe

为此,您需要旧版本的editbin或第三方工具,因为新版本会"健全性检查"您提供给它的版本。

在此之后,应用程序将加载,但它可能会开始抱怨 kernel32.dll 中缺少函数。

链接到的比利问题将带你走得比任何理智的程序员都更深入兔子洞。