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:
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 之前被包含:
// 正确顺序:先包含 asio(内部引入 WinSock2.h) #include <boost/asio.hpp> // 再包含 Windows 头文件 #include <windows.h>3.排查并替换旧头文件
检查项目代码中是否有直接#include <winsock.h>,全部替换为#include <winsock2.h>,两套头文件不能共存。
