error C2375: “WSAAsyncGetHostByName”: 重定义;不同的链接
win11
vs2015
背景:当项目中使用到了开源库,开源库使用WinSock2.h,同时windows项目又有包含Windows.h,
编译时常常会出现一堆编译错误,方法重定义等等。
问题原因:
默认windows.h头文件会包含winsock.h
//windows.h中的部分摘抄
#ifndef WIN32_LEAN_AND_MEAN
#include <cderr.h>
#include <dde.h>
#include <ddeml.h>
#include <dlgs.h>
#ifndef _MAC
#include <lzexpand.h>
#include <mmsystem.h>
#include <nb30.h>
#include <rpc.h>
#endif
#include <shellapi.h>
#ifndef _MAC
#include <winperf.h>
#include <winsock.h>
#endif
#ifndef NOCRYPT
#include <wincrypt.h>
#include <winefs.h>
#include <winscard.h>
#endif
winsock.h和winsock2.h都是Windows下的网络编程接口,但winsock2.h设计的目的是替代winsock.h,而不是扩展它。具体来说,winsock2.h包含了winsock.h中定义的所有内容,并进行了更新和改进。如果在一个项目中同时使用这两个头文件,需要特别注意它们的包含顺序,因为winsock2.h在winsock.h之前包含时可以阻止编译器处理后面的winsock.h,从而避免编译错误。但如果winsock.h在winsock2.h之前包含,可能会导致编译错误,因为winsock2.h会尝试重新定义winsock.h已经定义的内容。不过这种处理方式适合头文件处理。如果是源文件里面的这种包含,可能还是会错误。
解决方案
这样可以解决大部分由winsock2.h造成的问题了。如果是在源文件里也包含了winsock2.h,那么可能只是错误减少,但仍有编译错误(经过上述处理,我的错误数量从84下降到28),需要采取下面的方式
在编译不过的头文件或者源文件最前面增加
#include <WinSock2.h>
特别是用到了<windows.h>