包括<winsock2.h>和<windows.h>winsock.h与winsock2.h警告的可能解决方案

问题描述 投票:0回答:1

在包含 时,我遇到了一个相对常见的问题(Windows 10、Eclipse、MinGW、链接的winsocket -lws2_32)

#warning Please include winsock2.h before windows.h

我有一个翻译单元,其中包含 Winsock2.h 和 windows.h - 一个非 Boost ASIO TCP 客户端。在包含windows.h和winsock2.h之前,我尝试了各种

#define WIN32_LEAN_AND_MEAN
#define _WINSOCKAPI_
,但没有任何帮助,#include的顺序也根本不重要,总是弹出同样的错误,并且警告总是在该 TCP 客户端的同一位置触发。

由于我最终找到了问题的根源,我想我会将这些信息添加到SO知识库中。

c++ winapi winsock winsock2
1个回答
0
投票

TLDR:项目中的另一个 .cpp 包含 ,并且默认情况下 windows.h 包含 Winsock.h,除非明确告知不要这样做。

问题的原因原来是另一个翻译单元,在逻辑上与触发警告消息的位置完全无关,也出于自己的目的而包含 (在我的例子中是串行端口库)。该库从未发出任何警告,没有迹象表明这是问题的根源。在一个最小的示例项目中没有winsock版本冲突警告,但在我的主要大型项目中仍然有警告之后,我有点半随机地偶然发现了它。这让我觉得可能在其他地方包含了 windows.h,并且 windows.h 会自动拉取 Winsock.h,除非明确告知不要这样做。第一个选择是跨平台串行库,因为使用此类库是有意义的

一旦我确定串行库中的 不会自动包含 ,ASIO TCP 客户端翻译单元中的警告就消失了。就我而言,我只是将 -DWIN32_LEAN_AND_MEAN 添加到预处理器定义的符号 (-D) 中。另外,在包含 windows.h 之前在串行库头中定义 WIN32_LEAN_AND_MEAN 也有效。这意味着,在项目中的任何位置包含 时需要格外小心。

最终,我选择了这个:

g++ -std=c++2a -DWIN32_LEAN_AND_MEAN...
© www.soinside.com 2019 - 2024. All rights reserved.