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