C++ Windows XP Support for VS 2017 (v141) tools [Deprecated]
即可。之后在Visual Studio中的项目属性中设置该工具集。根据链接的文章,使用XP支持编译C++应用程序就足够了。但是,当我在XP 64位SP2上运行我的.exe
文件时,它显示错误,即KERNEL32.DLL
中找不到CompareStringEx
函数。因此,似乎仅使用此工具集是不够的,还需要其他东西。
在其他一些地方,我看到在编译时需要添加定义/D_USING_V110_SDK71_
,并且在链接时需要添加选项/SUBSYSTEM:CONSOLE,5.01
。在我的项目属性中,我也尝试添加这两个选项,但最终应用程序的导入表中仍然有CompareStringEx
。
正如@BenVoigt建议的那样,我进行了定义/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
(在x86或x64 redists中)。
但是对于我的项目来说,拥有静态链接的运行时(C ++ CRT),即在项目属性中使用Multi Threaded
值,非常重要。只有当真的不可能时,我才会使用DLL CRT。在此之前,欢迎提出关于如何静态链接CRT以生成XP兼容EXE的解决方案。
hid.lib
并注释掉该库函数的使用并没有起到作用。最终生成的.exe
仍然包含CompareStringEx
导入符号。 - Artyv141_xp
吗? 看似与安装程序中出现的名称相矛盾,该工具包并不会将 Windows XP 支持添加到v141
工具链中,而是安装单独的v141_xp
工具链。 - Ben Voigtv141_xp
的.lib文件不应该使用例如InitializeSRWLock
,无论是意味着不同的实现还是某些类简单地缺失。您是否在使用第三方静态库? - Ben Voigt#pragma comment(lib)
,它可以告诉链接器链接某些库,绕过项目设置。链接器本身只应添加C标准库和C++标准库,并不会默认添加任何WinAPI导入库。 - Ben Voigt