当我阅读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的建议(向下x86或x64分发),我下载了msvcp140.dll
的旧版本。
但它是非常重要的,我的项目有静态链接运行时(C++ CRT),即使用Multi Threaded
值为运行时字段在项目属性。只有当它是真的不可能只有那么我会使用DLL CRT。直到那时解决方案如何链接CRT静态是受欢迎的,当然产生XP兼容的EXE。
1条答案
按热度按时间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.WinXP
:C++ 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生成工具得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版本。