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

目录

1.错误原因

2.解决方案


1.错误原因

boost::asio 内部会引入 WinSock2.h,而项目中先包含了 Windows.h(或其他头文件间接包含了旧版 WinSock.h),导致 WinSock.hWinSock2.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>,两套头文件不能共存。

相关推荐
旖-旎4 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
c238565 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练:【二分答案】案例2:木材加工
c++·二分答案·csp·高频考点·信奥赛·木材加工
aaPIXa6226 小时前
C++模板元编程:编译期计算Fibonacci数列
java·开发语言·c++
Augustzero7 小时前
`co_await` 按下暂停键之后:从零看懂 C++20 协程
c++·后端
知无不研7 小时前
c语言和c++中的静态关键字
开发语言·c++·静态关键字
思麟呀8 小时前
在C++基础上理解CSharp-7
java·jvm·c++·c#
2601_949818098 小时前
Vector从入门到应用(C++ STL动态数组万字全解
开发语言·c++
汉克老师8 小时前
GESP2026年6月认证C++八级( 第三部分编程题(1、线网建设))精讲
c++·最小生成树·排序·kruskal·并查集·gesp8级