如何使用 Visual Studio 2017 构建面向 Windows XP 的 Winsock2 (WS2_32.lib) 应用程序

How to build a Winsock2 (WS2_32.lib) application targeting Windows XP with Visual Studio 2017

我有一个用 C++ 编写的应用程序,它使用套接字 (Winsock2.h)。它是在 Windows 10 上开发的,它在 Windows 10 上构建并且 运行 很好。有一台旧的 XP 机器,该应用程序必须 运行(机器无法升级,因为它包含在较新系统上不 运行 的遗留代码),但是当我尝试 运行 它上面的应用程序时,我收到错误消息:"The procedure entry point WSAPoll could not be located in the dynamic link library WS2_32.dll".

我尝试了以下方法:

  1. 我在 XP 机器上下载了 Visual Studio Express 2010 并尝试在其上构建应用程序:
    • 代码无法编译,因为它使用了 libpqxx 库(我怀疑 libpqxx 使用了一些 c++11 代码,VS2010 不完全支持);
  2. 我下载了 Visual Studio 2017 的 XP 工具集 (v141_xp) 并在 Windows 10 上构建了应用程序(我还在 XP 上下载并安装了Visual Studio 2017 的 Microsoft Visual C++ 可再发行组件);

    • 我遇到了同样的 "The procedure entry point WSAPoll could not be located in the dynamic link library WS2_32.dll" 错误。
  3. 我尝试使用winsock.h和link应用到wsock32.lib:

    • 我在 WS2_32.lib 上遇到了相同的入口点错误(可能是 VS link 将应用程序发送到 WS2_32.lib,即使我指定使用 wsock32.liB)。

有没有办法使用 xp 工具集在 VS2017 上构建一个使用 Ws2_32.lib 以 XP 为目标的应用程序?

编辑 2019-05-03 10:30

正如 cprogrammer 和 Remy Lebeau 所注意到的,WSAPoll 在 XP 中不存在。关键是我没有在我的代码中使用 WSAPoll。所以我听从了 Retired Ninja 的建议,从头开始使用 WinSock2 编写了一个应用程序,从最基本的开始逐步添加功能 (*)。好吧,我所有的代码都运行良好。关键是我还包含了另一个库 - libpqxx - 并且它可能使用 WSAPoll。

好吧,我仍然有问题,但至少我知道它在哪里

(*) 顺便说一句,我已经在使用 WS2_32.lib 的代码部分尝试了相同的方法,但由于问题出在另一个库中,我仍然遇到错误,所以建议开始从头开始真的很有帮助。

根据 docs,对于 WSAPoll,支持的最低客户端是 Windows 8.1,Windows Vista [桌面应用 | UWP 应用程序]

不能用于针对 Windows XP 的应用程序。

您的应用程序(或其依赖项之一)静态链接到 WSAPoll(),这在 XP 上根本不存在,它是在 Vista 中引入的。无论您的应用程序使用什么代码,利用 WSAPoll() 都必须为 XP 重写。例如,通过使用 GetProcAddress() 动态访问 WSAPoll() 而不是静态访问,并在 WSAPoll() 不可用。

实际上,代码应该被重写 - 期间,因为 WSAPoll() is broken 甚至微软已经记录在案,说 WSAPoll() 不会被修复并且不应该被使用。