【问题标题】:How to compile C++ app for Windows XP in MSVS?如何在 MSVS 中为 Windows XP 编译 C++ 应用程序?
【发布时间】:2022-01-12 17:57:37
【问题描述】:

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

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

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

因此,使用此工具集似乎是不够的。还需要别的东西。

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

作为@BenVoigt 的suggested,我确实定义了/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

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

【问题讨论】:

  • 您是否按照Using the Windows Headers -- Setting WINVER or _WIN32_WINNT 中的说明设置了WINVER
  • @BenVoigt 您能否建议应该设置什么WINVER 以支持 XP 64 位 SP2?是0x0502吗?
  • 是的,同一页上的表格指出0x0502 用于 XP Service Pack 2(或更高版本)
  • @BenVoigt 谢谢,在您的更改后CompareStringEx 从我项目的所有.obj 文件中消失了。但是最终的.exe 仍然导入了这个符号。这意味着一些.lib 文件链接到使用此符号的最终exe。我怀疑它是hid.lib,虽然hid.dll 存在Win XP 系统文件夹,但我仍然在Windows SDK 7(支持XP 的最后一个SDK)中找不到任何hid.lib。你可能知道我可以下载为 XP 编译的hid.lib 的任何地方吗?我的代码中需要它。
  • MSVCP140.DLL 存在于从 VS 2015 Update 3 到 VS 2022 的所有 Visual C++ REDIST 版本中。根据Microsoft Docs,您可以运行使用 VS 2015 Update 3 或 VS 2017 或 VS 构建的 C++ 程序2019 安装了最新的 VC++ 2022 REDIST。因此,如果您使用v141_xp 构建您的程序,那么它将在 Windows 7 SP1、Windows 8.x、Windows 10/11 系统上运行良好,并且自 VS 2017 版本以来使用任何 VC++ REDIST。

标签: c++ visual-studio visual-c++ windows-xp compatibility


【解决方案1】:

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 的 DLL。

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

对于 Windows XP 目标,您使用由 Visual Studio(VS 2017、VS 2019 或 VS 2022)安装的 v141_xp Platform Toolset,它是使用包含的 Windows 7.1A 的最新 VS 2017 (v141) C++ 编译器开发工具包。

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

  • Microsoft.VisualStudio.Component.WinXPC++ Windows XP 支持 VS 2017 (v141) 工具 [已弃用]
  • Microsoft.VisualStudio.Component.VC.v141.x86.x64: MSVC v141 - VS 2017 C++ x64/x86 构建工具 (v14.16)
  • Microsoft.VisualStudio.Component.VC.v141.MFC用于 v141 构建工具(x86 和 x64)的 C++ MFC

如果您正在进行 DirectX 开发,请务必阅读 this blog post 以及使用 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:如果您查看 msvcp140.dll 的 14.30(v143 版本)、14.29(v142 最新版本)和/或 14.16(v141 最新版本)副本的 dumpbin /imports,您将看到不同的导入。位于 C:\windows\SysWOW64 文件夹中的 msvcp140.dll 将是 14.30 版本。

【讨论】:

  • 感谢您的回答!事实上,在我动态链接 CRT 并使用您的链接下载/安装旧版本的 msvcp140.dll 之后,我的应用程序在 XP 上成功运行。但是在安装C++ Windows XP Support for VS 2017 (v141) tools [Deprecated] 工具集后,我拥有的最旧的 Redist 是D:\bin2\VisualStudio\2022\Preview\VC\Redist\MSVC\14.29.30133\x86\Microsoft.VC142.MFC,它也不是 CRT,而是 MFC。我没有文件夹 14.16 或类似的东西。我是否必须查看磁盘上的其他位置,或者在 MSVS 安装程序中安装一些其他软件包?
  • 对于我的项目来说,静态链接 CRT 非常重要,而不是单独的 msvcp140.dll,是否可以通过静态 CRT 链接实现相同的 XP 兼容版本?我怎么做?如果可能,我需要没有任何外部部署的 DLL 的 EXE 应用程序,默认安装的 XP dll 除外。如果不可能,我当然会部署您链接的旧 msvc140.dll redist。
  • 无论如何,答案都很好,投票赞成!
  • 确保您已安装各个组件“MSVC v141 - VS 2017 C++ x64/x86 build tools (v14.16)”、“C++ Windows XP Support for VS 2017 (v141) tools [Deprecated] ”和“用于 v141 构建工具 (x86 & x64) 的 C++ MFC”。这应该为您提供所需的 DLL/库。
  • 首先添加缺少的组件,然后重试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多