winsock.h与winsock2.h出现重定义或不同的链接

经常遇到编译socket程序的时候生成几百个错误

以下是出错后的错误信息:
>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(91) : warning C4005: “AF_IPX”: 宏重定义 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(460) : 参见“AF_IPX”的前一个定义 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(127) : warning C4005: “AF_MAX”: 宏重定义 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(479) : 参见“AF_MAX”的前一个定义 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(163) : warning C4005: “SO_DONTLINGER”: 宏重定义 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(402) : 参见“SO_DONTLINGER”的前一个定义 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(206) : error C2011: “sockaddr”: “struct”类型重定义 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(485) : 参见“sockaddr”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(384) : error C2143: 语法错误 : 缺少“}”(在“常量”的前面) 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(384) : error C2143: 语法错误 : 缺少“;”(在“常量”的前面) 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(384) : error C2059: 语法错误 : “常量” 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(437) : error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(437) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>c:program filesmicrosoft sdkswindowsv6.0aincludews2def.h(437) : error C2011: “sockaddr_in”: “struct”类型重定义 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(312) : 参见“sockaddr_in”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(132) : error C2011: “fd_set”: “struct”类型重定义 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(68) : 参见“fd_set”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(167) : warning C4005: “FD_SET”: 宏重定义 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(102) : 参见“FD_SET”的前一个定义 ...(太多了 不贴了) 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(874) : 参见“WSASetLastError”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2197) : error C2375: “WSAGetLastError”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(876) : 参见“WSAGetLastError”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2214) : error C2375: “WSAIsBlocking”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(878) : 参见“WSAIsBlocking”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2231) : error C2375: “WSAUnhookBlockingHook”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(880) : 参见“WSAUnhookBlockingHook”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2248) : error C2375: “WSASetBlockingHook”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(882) : 参见“WSASetBlockingHook”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2265) : error C2375: “WSACancelBlockingCall”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(884) : 参见“WSACancelBlockingCall”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2287) : error C2375: “WSAAsyncGetServByName”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(886) : 参见“WSAAsyncGetServByName”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2314) : error C2375: “WSAAsyncGetServByPort”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(894) : 参见“WSAAsyncGetServByPort”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2340) : error C2375: “WSAAsyncGetProtoByName”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(902) : 参见“WSAAsyncGetProtoByName”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2365) : error C2375: “WSAAsyncGetProtoByNumber”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(909) : 参见“WSAAsyncGetProtoByNumber”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2390) : error C2375: “WSAAsyncGetHostByName”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(916) : 参见“WSAAsyncGetHostByName”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2417) : error C2375: “WSAAsyncGetHostByAddr”: 重定义;不同的链接 1> c:program filesmicrosoft sdkswindowsv6.0aincludewinsock.h(923) : 参见“WSAAsyncGetHostByAddr”的声明 1>c:program filesmicrosoft sdkswindowsv6.0aincludewinsock2.h(2440) : error C2375: “WSACancelAsyncRequest”: 重定义;不同的链接

原因分析]  
      主要原因是因为<Windows.h>中包含了<Winsock.h>头文件,由于其版本的不同

解决方案一: 添加预编译头

项目属性   ——>  C/C++   ———>  预处理器  -------> 预处理器定义

 增加如下定义

WIN32_LEAN_AND_MEAN

解决方案二:

在编译不过的头文件前面增加

#include <Winsock2.h>

特别是用到了<windows.h>

https://blog.csdn.net/starelegant/article/details/72460728

原文地址:https://www.cnblogs.com/leijiangtao/p/4677854.html