使用Visual Studio 11编译的可执行文件有何特殊之处,导致这些可执行文件无法在Windows XP上运行?

30

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

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

根据微软的说法, Visual Studio 11不支持Windows XP。

为什么生成的可执行文件不能在Windows XP上执行?可执行文件中是否有特殊内容?


我使用Win32项目并创建了一个Win32应用程序。 - Norbert Willhelm
1
这是一个32位应用程序。Dumpbin的结果如下: 文件转储 [路径]文件类型:可执行映像 概要 3000 .data 3000 .rdata 2000 .reloc 1000 .rsrc 6000 .text - Norbert Willhelm
@Anders,创建这个函数的假版本是如何工作的? - Norbert Willhelm
1
@NorbertWillhelm:我所提供链接的页面替换了一些函数... - Anders
VS2013相关问题 - Edward Brey
显示剩余3条评论
4个回答

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

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


5
我会展示给您哪些函数(对于CRT和MFC)缺失,并告诉您如何解决XP系统上缺失这些函数的问题。具体信息可以参考以下博客文章:http://tedwvc.wordpress.com/2012/03/11/how-to-get-visual-c-2012-vc-11-beta-statically-linked-crt-and-mfc-applications-to-run-on-windows-xp/ - Ted.

8

Visual Studio 2012现在可以在2012年晚些时候将目标定在Windows XP:

使用Visual Studio 2012中的C++来定位Windows XP

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

编辑:此事已经实现(哇!)


4
解决方法是使用不同的平台工具集,这将链接不同版本的 CRT 并生成与早期操作系统兼容的二进制文件。
详情请参见:在 Visual Studio 11 Beta 中使用 Visual Studio 2010 编译器和库来针对 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

1

随着VS 2010及更高版本捆绑的运行时库,强制您的可执行文件从kernel32.dll导入两个新函数:EncodePointer和DecodePointer。这些函数是为了另一种天真的尝试增强软件“安全性”而需要的,但在Windows XP上缺失。

在VS 2010中,有一个选项可以使用Visual Studio 2008的运行时库,从而解决了这个问题。我不知道在后续版本的VS中是否有这样的选项。


这是一个原因。但它并不是唯一的原因。 - Norbert Willhelm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接