使用 Visual Studio 11 编译的可执行文件有啥特别之处导致无法在 Windows XP 上执行?

Posted

技术标签:

【中文标题】使用 Visual Studio 11 编译的可执行文件有啥特别之处导致无法在 Windows XP 上执行?【英文标题】:What is special about the executables compiled with Visual Studio 11 which results in that the executables cannot be executed on Windows XP?使用 Visual Studio 11 编译的可执行文件有什么特别之处导致无法在 Windows XP 上执行? 【发布时间】:2012-03-22 00:11:45 【问题描述】:

我使用 Visual Studio 11 Developer Preview 编译我的 C++ 源代码。我静态链接到运行时库。

生成的可执行文件无法在 Windows XP 上执行。当我尝试在 Windows XP 上执行它时,我收到错误消息“[Executable Path] 不是有效的 Win32 应用程序。”。

According to MicrosoftVisual Studio 11 将不支持 Windows XP。

生成的可执行文件无法在 Windows XP 上执行是怎么回事?可执行文件中有什么特别之处吗?

【问题讨论】:

您在 VS2011 中为您的应用程序使用哪种项目类型? 我使用一个 Win32 项目并创建一个 Win32 应用程序。 这是一个 32 位的应用程序。 dumpbin 的结果是: Dump of file [Path] File Type: EXECUTABLE IMAGE Summary 3000 .data 3000 .rdata 2000 .reloc 1000 .rsrc 6000 .text 我应该为 dumpbin 使用不同的命令行选项吗? @NorbertWillhelm:我链接的页面替换了一些功能... 【参考方案1】:

Visual Studio 2012 将能够在 2012 年晚些时候面向 Windows XP:

Targeting Windows XP with C++ in Visual Studio 2012

“今年秋天晚些时候,Microsoft 将提供 Visual Studio 2012 更新,这将使 C++ 应用程序能够以 Windows XP 为目标。此更新将对 Visual C++ 2012 编译器、运行时和库进行必要的修改,以启用开发人员创建在 Windows XP 和更高版本以及 Windows Server 2003 和更高版本上运行的应用程序和 DLL。”

编辑:现在已经发生了(呸!)

【讨论】:

【参考方案2】:

解决方法是使用不同的Platform Toolset,它将链接不同版本的 CRT 并生成与旧操作系统兼容的二进制文件。

在此处查看更多信息:Target Windows XP in Visual Studio 11 Beta using the Visual Studio 2010 compiler and libraries。

使用v90 工具集,您的二进制文件甚至可以在旧系统(例如 Windows 2000)中运行。

http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-65-69/7444.BlogPic.png

【讨论】:

【参考方案3】:

与 VS 2010 及更高版本捆绑的运行时库强制您的可执行文件从 kernel32.dll 导入 Windows XP 上缺少的两个新函数:EncodePointerDecodePointer。这些对于增强软件“安全性”的又一次白痴天真的尝试是必需的。

在 VS 2010 中有一个使用 Visual Studio 2008 的运行时库的选项,它解决了这个问题。不知道以后的VS有没有这样的选项。

【讨论】:

这是一个原因。但它不是唯一的。【参考方案4】:

他们似乎在每个新版本的 VS (NT4,2000,XP) 中都放弃了对旧系统的支持,即使你根本不使用 CRT,他们仍然会强制 PE 子系统版本使用高数字。您可以在后期构建步骤中通过 changing the numbers back 到 5.0 来解决这个问题。只需更改这些数字即可让 exe 在 XP 上启动,除非新 CRT 使用 XP 上不存在的 WinAPI 函数。

如果您想继续使用 VS11,另一种选择是使用多目标和较旧的编译器...

【讨论】:

我在这篇博文中向您展示了缺少哪些功能(对于 CRT 和 MFC)以及如何解决这些功能在 XP 上缺少的事实:tedwvc.wordpress.com/2012/03/11/…

以上是关于使用 Visual Studio 11 编译的可执行文件有啥特别之处导致无法在 Windows XP 上执行?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 调试模式编译的可执行文件: jmp 到函数体而不是调用中的直接地址

Visual Studio 添加与 dll 同名的可执行文件

Win 7 x64 + Visual Studio 2015为WinXP编译可执行程序

Visual Studio C++11g 编译错误 - 初始化程序太多

Visual Studio 2013 编译严格的 c++11

Matlab 中的 Visual Studio 2012 编译器更新