在包含
<windows.h>
和 <winsock2.h>
时,我遇到一个相对常见的问题(Windows 10、Eclipse、MinGW,使用 -lws2_32
链接到 WinSock)
#warning 请在 windows.h 之前包含 Winsock2.h
我有一个翻译单元,其中包括
winsock2.h
和 windows.h
- 一个非 Boost ASIO TCP 客户端。在添加 #define WIN32_LEAN_AND_MEAN
和 #define _WINSOCKAPI_
之前,我尝试了各种 windows.h
或 winsock2.h
,但没有任何帮助。 #include
的顺序也完全无关紧要,总是弹出相同的错误,并且警告总是在这个TCP客户端的相同位置触发。
TLDR:项目中的另一个
.cpp
文件包含 <windows.h>
,并且默认情况下 windows.h
包含 winsock.h
,除非明确告知不要这样做。
问题的原因原来是另一个翻译单元,在逻辑上与触发警告消息的位置完全无关,也出于自己的目的而包含
<windows.h>
(在我的例子中是串行端口库)。
该库从未发出任何警告,没有迹象表明这是问题的根源。在一个最小的示例项目中没有 WinSock 版本冲突警告,但在我的主要大型项目中仍然有警告之后,我有点半随机地偶然发现了它。这让我觉得
windows.h
可能包含在其他地方,并且 windows.h
会自动拉动 winsock.h
,除非明确告知不要这样做。
第一个选择是跨平台串行库,因为使用此类库是有意义的
<windows.h>
。
一旦我确定串行库中的
<windows.h>
不会自动包含 <winsock.h>
,ASIO TCP 客户端翻译单元中的警告就消失了。就我而言,我只是将 -DWIN32_LEAN_AND_MEAN
添加到预处理器定义的符号 (-D
)。此外,在包含 WIN32_LEAN_AND_MEAN
之前在串行库标头中定义 windows.h
也有效。这意味着,在项目中的任何位置包含 <windows.h>
时需要格外小心。
最终,我选择了这个:
g++ -std=c++2a -DWIN32_LEAN_AND_MEAN...