[英]Winsock2.h vs winsock2.h and wsock32.lib vs 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计算机必须在其上运行该应用程序(由于该计算机包含的旧代码无法在较新的系统上运行,因此无法升级),但是当我尝试在其上运行该应用程序时,出现错误:“过程入口点WSAPoll不能位于动态链接库WS2_32.dll中”。
我尝试了以下方法:
我下载了适用于Visual Studio 2017的XP工具集(v141_xp),并在Windows 10上构建了该应用程序(我还下载并安装了XP上用于Visual Studio 2017的Microsoft Visual C ++ Redistributable);
我尝试使用winsock.h并将应用程序链接到wsock32.lib:
有没有一种方法可以使用xp工具集在VS2017上构建使用针对Windows XP的Ws2_32.lib的应用程序?
编辑2019-05-03 10:30
正如程序员和Remy Lebeau所注意到的那样,XP中不存在WSAPoll。 关键是我不在代码中使用WSAPoll。 因此,我遵循了《退休忍者》的建议,从零开始,使用WinSock2编写了一个应用程序,从非常基本的步骤开始,并逐步添加了功能(*)。 好吧,我所有的代码都运行良好。 关键是我还包括了另一个库– libpqxx-可能使用了WSAPoll。
好的,我仍然有问题,但至少我知道它在哪里
(*)顺便说一句,我已经在使用WS2_32.lib的代码部分中尝试了相同的方法,但是由于问题出在另一个库中,我仍然遇到错误,因此从头开始的建议确实很有帮助。
根据文档 ,对于WSAPoll
,支持的最低客户端是Windows 8.1,Windows Vista。 UWP应用]
不能用于以Windows XP为目标的应用程序。
您的应用程序(或其依赖项之一)是静态链接到WSAPoll()
,而WSAPoll()
在XP中根本不存在,它是在Vista中引入的。 无论您的应用使用的是哪种代码,都使用WSAPoll()
都必须为XP重写。 例如,通过使用GetProcAddress()
动态而非静态地访问WSAPoll()
,并在WSAPoll()
不可用时使用回退( select()
, WSAAsyncSelect()
, WSAEventSelect()
等)。
实际上,应该重写代码-句号,因为WSAPoll()
已损坏 ,甚至Microsoft都记录在案,称WSAPoll()
将不固定且不应使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.