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

相关推荐
海绵天哥6 小时前
LeetCode Hot 100 | 链表(下)· 分组翻转与设计(C++ 题解)
c++·leetcode·链表
choumin6 小时前
行为型模式——中介者模式
c++·设计模式·中介者模式·行为型模式
Lee_jerome17 小时前
《C/C++编译全家桶:g++四阶段、.a与.so区别、CMake构建、ARM交叉编译,这篇全讲透了》
c语言·开发语言·arm开发·c++·编译·cmake·cmakelists
冰心孤城17 小时前
C++ 与 C#混合编程 示例 (基于VS)
java·c++·c#
一只旭宝20 小时前
C++手写shared_ptr共享智能指针|原子引用计数、强弱引用控制块、赋值重载底层深度剖析
开发语言·c++·面试
开发者联盟league21 小时前
Java 通过 JNA 调用 C++ DLL:关键流程总结
java·c++·jna
库克克1 天前
【C++】智能指针
java·开发语言·c++
一拳一个呆瓜1 天前
【STL】iostream 编程:输入流成员函数
c++·stl
xiaoye-duck1 天前
《Linux系统编程》Linux 系统多线程(七): C++ 线程安全日志系统封装:基于策略模式解耦,兼容 glog 使用风格
linux·c++·日志系统
程序喵大人1 天前
【C++进阶】STL容器与迭代器 - 07 迭代器是容器和算法之间的通用游标
开发语言·c++·算法