MS C++(CL)编译的可执行文件在 Windows 2000 上不起作用 [重复]
Posted
技术标签:
【中文标题】MS C++(CL)编译的可执行文件在 Windows 2000 上不起作用 [重复]【英文标题】:MS C++ (CL) compiled executable does not work on Windows 2000 [duplicate] 【发布时间】:2011-05-22 17:05:56 【问题描述】:可能重复:Issue using Visual Studio 2010 compiled C++ DLL in Windows 2000
类似于这些问题:Can I use Visual Studio 2010's C++ compiler with Visual Studio 2008's C++ Runtime Library?Can VS2010 create native executable file working under 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 compiler 或linker options 的形式,而不是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 操作系统的本机可执行文件?
【问题讨论】:
@Billy:微软好,开发者最好的朋友。 我认为对 Win2k 的支持也在几年前就结束了...但是由于您使用的是 2010,它具有在 VC9 配置中构建可执行文件的内置支持。 @RedX:从 CL 命令行支持 VC9? 如果您使用的是 MSBuild,是的。使用msbuild myProject.vcxproj /p:PlatformToolset=v90
调用MSbuild 您必须安装VC9 版本。见:msdn.microsoft.com/en-us/library/ee662426.aspx
不,它们不提供使用适用于 Windows 2000 的 10 版工具编译代码的方法。更高版本的 CRT 与 W2K 不兼容。但正如其他人所提到的,只要您安装了 VS 2008,就可以在 VS 2010 中使用 VS 9.0 工具集。做起来很简单,我用这种方式编译了很多代码。只需更改项目属性中的设置即可。
【参考方案1】:
您的错误“foo.exe 不是有效的 Win32 应用程序”可以通过使用 editbin 将 PE 标头中的“最低操作系统版本”字段设置为 0x0500 (Windows 2000) 来修复。
EDITBIN /VERSION:5,0 foo.exe
您需要一个旧版本的 editbin 或第三方工具,因为新版本会“检查”您提供的版本。
在此之后,应用程序将加载,但它可能会开始抱怨 kernel32.dll 中缺少函数。
你链接到的比利的问题会让你陷入比任何理智的程序员都想去的兔子洞更远的地方。
【讨论】:
EDITBIN /VERSION:5.0 /SUBSYSTEM:CONSOLE,5.0 foo.exe
像你说的那样工作,但是加载失败,因为它在KERNEL32.DLL
中找不到DecodePointer
。以上是关于MS C++(CL)编译的可执行文件在 Windows 2000 上不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章