【发布时间】: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