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>,两套头文件不能共存。

相关推荐
青少儿编程课堂9 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack11 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
青少儿编程课堂12 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
草莓熊Lotso12 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
David猪大卫1 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger1 天前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz1 天前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化1 天前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu1 天前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu1 天前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem