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

hmtdttj4  于 2022-11-17  发布在  Windows
关注(0)|答案(1)|浏览(204)

当我阅读this article时,下载最新的MSVS 2022并安装工具集C++ Windows XP Support for VS 2017 (v141) tools [Deprecated]就足够了。
之后,在Visual Studio内部的项目属性我设置了这个工具集。根据链接的文章,它足以编译具有XP支持的C应用程序。
但是在我的.exe文件创建后,如果我在XP 64位SP2上运行它,那么它会显示CompareStringEx函数在KERNEL32.DLL中找不到的错误。
因此,使用这个工具集似乎是不够的,还需要其他的东西。
在其他一些地方,我看到在编译时还需要添加define /D_USING_V110_SDK71_,在链接时还需要添加option /SUBSYSTEM:CONSOLE,5.01。在我的项目属性中,我也尝试添加这两个选项,但CompareStringEx仍然在最终应用程序的导入表中。
正如@BenVoigt所建议的那样,我定义了/DWINVER=0x0502 /D_WIN32_WINNT=0x0502。还将C
标准设置为/std:c++14(我会设置C11,但这个MSVS版本最低只允许设置C14)。仍然有一些非XP符号保留在最终的EXE中,如InitializeSRWLock,它可能被我代码中的C++11的std::mutex使用。
有没有人知道编译完全兼容XP的应用程序所需要的一切?

更新。我设法通过做上面的事情,加上将C++ CRT运行时设置为Multi Threaded DLL,即使用CRT的动态DLL链接来构建工作的XP应用程序。还根据@ChuckWalbourn的建议(向下x86x64分发),我下载了msvcp140.dll的旧版本。

但它是非常重要的,我的项目有静态链接运行时(C++ CRT),即使用Multi Threaded值为运行时字段在项目属性。只有当它是真的不可能只有那么我会使用DLL CRT。直到那时解决方案如何链接CRT静态是受欢迎的,当然产生XP兼容的EXE。

wi3ka0sx

wi3ka0sx1#

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。
    使用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开发,请务必阅读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最新版本)副本,你会看到不同的导入。位于C:\windows\SysWOW64文件夹中的msvcp140.dll将是14.30版本。

展开查看全部

相关问题