error C2375: “WSAAsyncGetHostByName”: 重定义;不同的链接

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>

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值