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

How to compile C++ app for Windows XP in MSVS?

当我阅读 this article, it is enough to download most recent MSVS 2022 然后安装工具集 C++ Windows XP Support for VS 2017 (v141) tools [Deprecated]

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

但是在我的 .exe 文件创建之后,如果我在 XP 64 位 SP2 上 运行 它然后它显示错误 CompareStringEx 函数在 KERNEL32.DLL 中找不到.

因此看来仅使用此工具集是不够的。还需要其他东西。

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

作为我的代码中的 by @BenVoigt, I did defines /DWINVER=0x0502 /D_WIN32_WINNT=0x0502. Also set C++ standard to /std:c++14 (I would set C++11 but this MSVS version allows to set only C++14 at minimum). Still some non-XP symbols remain in final EXE like InitializeSRWLock that is possibly used by C++11's std::mutex

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

更新。通过执行上述操作加上将 C++ CRT 运行time 设置为 Multi Threaded DLL,即使用动态 DLL linkage of CRT,我设法构建了工作 XP 应用程序。同样作为@ChuckWalbourn 的,我下载了旧版本的msvcp140.dll

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

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

-或-

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

If you want the latest bug fixes to the CRT, you can also download the REDIST for VS 2019 (16.7) per the link on Microsoft Docs.

对于 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.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 构建工具(x86 和 x64)的 C++ MFC

If you are doing DirectX development, be sure to read this blog post as well for various implications of using the 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 文件,这些文件 binary compatible 与您的 v141_xp 平台工具集构建的 EXE,但是那些 VC++ REDIST DLL 与 Windows XP 兼容。

IOW: If you look at a dumpbin /imports of the 14.30 (v143 version), 14.29 (v142 latest version), and/or 14.16 (v141 latest version ) copies of msvcp140.dll you will see different imports. The msvcp140.dll sitting in your C:\windows\SysWOW64 folder is going to be the 14.30 version.