如何在MSVS中为Windows XP编译C++应用程序?

3
当我阅读这篇文章时,只需下载最新的MSVS 2022并安装工具集C++ Windows XP Support for VS 2017 (v141) tools [Deprecated]即可。之后在Visual Studio中的项目属性中设置该工具集。根据链接的文章,使用XP支持编译C++应用程序就足够了。但是,当我在XP 64位SP2上运行我的.exe文件时,它显示错误,即KERNEL32.DLL中找不到CompareStringEx函数。因此,似乎仅使用此工具集是不够的,还需要其他东西。

在其他一些地方,我看到在编译时需要添加定义/D_USING_V110_SDK71_,并且在链接时需要添加选项/SUBSYSTEM:CONSOLE,5.01。在我的项目属性中,我也尝试添加这两个选项,但最终应用程序的导入表中仍然有CompareStringEx

正如@BenVoigt建议的那样,我进行了定义/DWINVER=0x0502 /D_WIN32_WINNT=0x0502。还将C++标准设置为/std:c++14(我想设置C++11,但是这个MSVS版本只允许设置至少C++14)。但是最终的EXE文件中仍然存在一些非XP符号,例如InitializeSRWLock,可能被我代码中的C++11的std::mutex所使用。

有人知道编译完全兼容XP应用程序所需的一切吗?

更新。我通过执行上述操作并将C ++ CRT运行时设置为Multi Threaded DLL(即使用CRT的动态DLL链接)来构建了可工作的XP应用程序。此外,正如@ChuckWalbourn(在suggested中)建议的那样,我下载了旧版本的msvcp140.dll(在x86x64 redists中)。

但是对于我的项目来说,拥有静态链接的运行时(C ++ CRT),即在项目属性中使用Multi Threaded值,非常重要。只有当真的不可能时,我才会使用DLL CRT。在此之前,欢迎提出关于如何静态链接CRT以生成XP兼容EXE的解决方案。


@BenVoigt 尝试移除链接中的 hid.lib 并注释掉该库函数的使用并没有起到作用。最终生成的 .exe 仍然包含 CompareStringEx 导入符号。 - Arty
你的工具链设置为 v141_xp 吗? 看似与安装程序中出现的名称相矛盾,该工具包并不会将 Windows XP 支持添加到 v141 工具链中,而是安装单独的 v141_xp 工具链。 - Ben Voigt
工具链选项应该控制编译器提供的库(例如C++标准库)的获取位置... v141_xp 的.lib文件不应该使用例如InitializeSRWLock,无论是意味着不同的实现还是某些类简单地缺失。您是否在使用第三方静态库? - Ben Voigt
虽然新项目向导默认会添加一些导入库(用于WinAPI DLL),但您可以在项目属性中编辑该列表。同时要注意 #pragma comment(lib),它可以告诉链接器链接某些库,绕过项目设置。链接器本身只应添加C标准库和C++标准库,并不会默认添加任何WinAPI导入库。 - Ben Voigt
1
“MSVCP140.DLL” 存在于 Visual C++ REDIST 的所有版本中,从 VS 2015 Update 3 到 VS 2022。根据 Microsoft Docs ,如果你使用 VC++ 2022 REDIST 软件包安装了最新的程序,则可以运行用 VS 2015 Update 3、VS 2017 或 VS 2019 构建的 C++ 程序。因此,如果您使用“v141_xp”构建您的程序,则可以在 Windows 7 SP1、Windows 8.x、Windows 10/11 系统上使用任何自 VS 2017 发布以来的 VC++ REDIST 运行它们。 - Chuck Walbourn
显示剩余24条评论
1个回答

5

TL;DR 要支持Windows XP VC++ REDIST,请在Windows XP系统上安装https://aka.ms/vs/15/release/VC_redist.x86.exe

- 或 -

如果您正在进行“并行应用程序本地部署”,则使用来自 C:\Program Files\Microsoft Visual Studio\2022\<edition>\VC\Redist\MSVC\14.16.27012\x86\Microsoft.VC141.CRT 的 DLL。

如果想要最新的 CRT 错误修复,请根据 Microsoft Docs 上的链接下载VS 2019(16.7)的REDIST。

对于针对 Windows XP 的开发,您需要使用 Visual Studio(VS 2017、VS 2019 或 VS 2022)安装的 v141_xp 平台工具集,这是最新的 VS 2017(v141)C++ 编译器,使用了 Windows 7.1A SDK。

请确保已安装以下单独组件(对于 VS 2022),因为您正在使用 MFC:

  • Microsoft.VisualStudio.Component.WinXPVS 2017(v141)工具的 C++ Windows XP 支持 [已弃用]
  • Microsoft.VisualStudio.Component.VC.v141.x86.x64MSVC v141 - VS 2017 C++ x64/x86 构建工具(v14.16)
  • Microsoft.VisualStudio.Component.VC.v141.MFCv141 构建工具的 C++ MFC (x86 & x64)

如果您正在进行 DirectX 开发,请务必阅读 此博客文章,以了解使用 Windows 7.1A SDK 的各种影响。

部署到 Windows XP 时,可以安装最新的 VS 2017 Visual C++ REDIST 或使用 VS 2019 Visual C++,直到 VS 2019 (16.7)。之后,REDIST DLL 本身就不兼容Windows XP。

在安装有 VS 2022 的开发系统上,您将拥有一组更新的 Visual C++ REDIST 文件,这些文件与您构建的 v141_xp 平台工具集的 EXE 二进制兼容,但是这些 VC++ REDIST DLL 是不兼容 Windows XP 的。

IOW:如果你查看14.30(v143版本)、14.29(v142最新版本)和/或14.16(v141最新版本)的 msvcp140.dlldumpbin /imports,你会发现它们有不同的导入。位于 C:\windows\SysWOW64 文件夹中的 msvcp140.dll 是14.30版本。

1
对于我的项目来说,使用静态链接的CRT非常重要,而不是作为单独的msvcp140.dll。是否可能通过静态CRT链接实现与XP兼容的版本?我该如何做到这一点?如果可能的话,我需要一个没有任何外部部署DLL的EXE应用程序,除了默认安装的XP dlls。如果不可能,当然我会部署你提供的旧的msvc140.dll redist。 - Arty
1
请确保已安装以下各个组件:“MSVC v141-VS 2017 C ++ x64 / x86构建工具(v14.16)”,“C ++ Windows XP支持VS 2017(v141)工具[已弃用]”和“C ++ MFC for v141 build tools(x86&x64)”。这应该为您提供所需的DLL / lib。 - Chuck Walbourn
1
首先添加缺失的组件,然后重试。 - Chuck Walbourn
谢谢,看起来很不错!至少现在,在静态构建中那些不兼容的函数已经消失了。在安装了你之前提到的那三个软件包之后,我测试了一下,但只在一台笔记本电脑上进行了测试,但是XP已经安装在另一台虚拟机上,几个小时后我将尝试在该XP上运行此EXE,并回复您。如果您将这3个软件包添加到您的答案中,那就太好了,因为它解决了我的问题,我会接受您的答案! - Arty
Windows XP x64(基本上是Windows Server 2003 SP1)。这是来自“wayback”机器的一个版本 :) - Chuck Walbourn
显示剩余3条评论

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