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

Art*_*oul 3 c++ compatibility windows-xp visual-studio visual-c++

当我阅读本文时,下载最新的MSVS 2022然后安装工具集就足够了C++ Windows XP Support for VS 2017 (v141) tools [Deprecated]

之后,我在 Visual Studio 项目属性内设置了此工具集。根据链接的文章,编译具有 XP 支持的 C++ 应用程序就足够了。

但是在.exe创建我的文件后,如果我在 XP 64 位 SP2 上运行它,则会显示错误:CompareStringExKERNEL32.DLL.

因此,使用这个工具集似乎还不够。还需要其他东西。

/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)。仍然有一些非 XP 符号保留在最终的 EXE 中,例如InitializeSRWLock,它可能由我的代码中的 C++11 的std::mutex使用。

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

更新。我通过执行上述操作并将 C++ CRT 运行时设置为Multi Threaded DLL,即使用 CRT 的动态 DLL 链接,成功构建了工作 XP 应用程序。另外,按照 @ChuckWalbourn (向下x86x64 redists)的建议,我下载了旧版本的.msvcp140.dll

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

Chu*_*urn 5

TL;DR对于 Window 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.

如果您想要 CRT 的最新错误修复,还可以通过Microsoft Docs上的链接下载 REDIST for VS 2019 (16.7) 。

对于 Windows XP 目标,您可以使用Visual Studio(VS 2017、VS 2019 或 VS 2022)安装的平台工具集,它是使用附带的 Windows 7.1A SDK 的v141_xp最新 VS 2017 ( ) C++ 编译器。v141

由于您使用的是 MFC,请确保您已安装(对于 VS 2022)以下各个组件:

  • Microsoft.VisualStudio.Component.WinXPC++ Windows XP 对 VS 2017 (v141) 工具的支持 [已弃用]
  • Microsoft.VisualStudio.Component.VC.v141.x86.x64MSVC v141 - VS 2017 C++ x64/x86 构建工具 (v14.16)
  • Microsoft.VisualStudio.Component.VC.v141.MFC用于 v141 构建工具的 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 文件,这些文件与平台工具集构建的 EXE二进制兼容v141_xp,但这些 VC++ REDIST DLL与 Windows XP兼容。

IOW:如果您查看dumpbin /imports14.30(v143 版本)、14.29(v142 最新版本)和/或 14.16(v141 最新版本)副本,msvcp140.dll您将看到不同的导入。msvcp140.dll您文件夹中的版本C:\windows\SysWOW64将是 14.30。