30

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

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

根据 Microsoft Visual Studio 11 将不支持 Windows XP。

生成的可执行文件无法在 Windows XP 上执行是如何工作的?可执行文件中有什么特别之处吗?

4

4 回答 4

21

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

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

于 2011-10-09T10:25:22.830 回答
8

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

在 Visual Studio 2012 中使用 C++ 面向 Windows XP

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

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

于 2012-06-18T10:06:04.053 回答
4

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

在此处查看更多信息:使用 Visual Studio 2010 编译器和库在 Visual Studio 11 Beta 中定位 Windows XP

使用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

于 2012-06-18T10:16:46.013 回答
1

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

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

于 2012-06-18T10:15:55.087 回答