fatal error C1189: #error: WinSock.h has already been included 的解决方案

目录

1.错误原因

2.解决方案


1.错误原因

boost::asio 内部会引入 WinSock2.h,而项目中先包含了 Windows.h(或其他头文件间接包含了旧版 WinSock.h),导致 WinSock.h 与 WinSock2.h 两套套接字 API 头文件重复 / 冲突包含,编译器直接报错。

2.解决方案

1.全局添加预处理器宏(最快修复,CMake/Qt 通用)

在你的 CMakeLists.txt 中给目标添加定义,阻止 Windows.h 自动引入旧版 WinSock.h:

cpp 复制代码
target_compile_definitions(ReviewControlPlugin PRIVATE
    _WINSOCKAPI_       # 阻止 Windows.h 自动包含 winsock.h
    WIN32_LEAN_AND_MEAN # 精简 Windows.h 包含内容,减少冲突概率
)

如果是 VS 项目,直接在「项目属性 → C/C++ → 预处理器 → 预处理器定义」中添加 _WINSOCKAPI_;。

2.调整头文件包含顺序

在所有 .cpp / 预编译头中,保证 boost/asio 相关头文件在 Windows.h 之前被包含:

cpp 复制代码
// 正确顺序:先包含 asio(内部引入 WinSock2.h)
#include <boost/asio.hpp>
// 再包含 Windows 头文件
#include <windows.h>

3.排查并替换旧头文件

检查项目代码中是否有直接 #include <winsock.h>,全部替换为 #include <winsock2.h>,两套头文件不能共存。

相关推荐
ShineWinsu4 分钟前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
YYYing.1 小时前
【设计模式系列 (七) 】桥接模式
c++·后端·设计模式·桥接模式
高山有多高2 小时前
【Linux笔记】Linux自定义Shell
linux·c++
悠仁さん2 小时前
【C++】vector 类
开发语言·c++
_upupup2 小时前
智能指针的原理及简单模拟实现(C++)
开发语言·c++
l1t2 小时前
DeepSeek总结的OpenZL压缩变换器
c++·算法
郝学胜-神的一滴3 小时前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
坤坤子吖3 小时前
算法学习——高精度加减乘除
c++·笔记·学习·算法
朝朝辞暮i3 小时前
C++ 第 14 课:引用 &
开发语言·c++·算法
白山编程大哥3 小时前
适合初学者练习的 C/C++ 开源项目推荐
c语言·c++·开源