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

相关推荐
·present·5 小时前
CSAPP(lecture 4_01)
c语言·c++
FPGA小迷弟5 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude
程序员-King.5 小时前
【ROS1】Noetic 开发工作流程与常用命令
c++·ubuntu·ros
云深麋鹿5 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
傲世仙尊7 小时前
string增删查改-insert-erase-replace与find加substr组合技
c++
·present·8 小时前
CSAPP(lecture 3)
c++
别动我齐刘海9 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
Patrick在香港9 小时前
第 16,216 次连接之后,它不干了
python·网络编程·socket·tcp·连接池
basketball6169 小时前
C++ 中字符串与常见类型的转换总结
开发语言·c++
等我调个Bug9 小时前
C++智能指针通俗讲解
开发语言·c++