VS2008 编译错误<winsock2.h>

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

尝试编译包含

<winsock2.h>
的 VS2008 c++ 项目时,出现大量 (105) 重新定义和语法错误。运行 Windows 7 64 位。 我用谷歌搜索了一下,答案似乎很统一,但它似乎对我不起作用。

尝试将

#include <winsock2.h>
放在
#include <windows.h>
之前。还尝试不包含
<windows.h>
(因为 winsock2 如果丢失,会自动包含它)。

之前尝试过

#define WIN32_LEAN_AND_MEAN
和/或
#define _WINSOCKAPI_

在链接器 -> 附加依赖项中我引用了 ws2_32.lib。 也尝试过

#pragma comment(lib,  "ws2_32.lib")

为了以防万一,我重建了整个解决方案。

常见错误(似乎有很多人共享):

Error   5   error C2011: 'sockaddr' : 'struct' type redefinition    c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h  206 RallyAction
Error   6   error C2143: syntax error : missing '}' before 'constant'   c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h  384 RallyAction
Error   7   error C2143: syntax error : missing ';' before 'constant'   c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h  384 RallyAction
Error   8   error C2059: syntax error : 'constant'  c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h  384 RallyAction

...等等,等等

如有任何建议,我们将不胜感激。

c++ visual-studio-2008 visual-c++ sockets
4个回答
14
投票

我有一个“WinsockWrapper.h”标头,它可以帮助我确保一致性......其要点是;

#ifndef _WINDOWS_
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

在任何需要winsock2.h的文件中可能引入windows.h的任何其他内容之前包含此内容

这,恕我直言,意味着将其放在大多数需要winsock2.h的文件的顶部...

确保您的预编译标头(如果您正在使用它)也首先包含此内容。


2
投票

这是一个众所周知的问题。不知何故,微软使winsock.h和winsock2.h不兼容。这个问题从 MSVC 6 开始就存在。

这只是您包含的文件之一还包含winsock.h,而您稍后包含winsock2.h

解决此问题的方法之一是首先包含winsock2.h。甚至在 windows.h 之前(它会自动包含 windows.h)


2
投票

结果 < windows.h> 在项目的其他地方(单独的 .h 文件)且在上述 .h 文件之前被调用。这就是我迟到编码所得到的结果。感谢您的帮助,感激不尽。

我用 < windows.h> 替换了 < winsock2.h> 调用,现在工作正常。

include < mmsystem.h>在那之后开始随机给我带来问题(每隔一个编译)。我用 #ifdef _WIN32 封装了它,但它看起来仍然是随机的。在上次成功编译后(每隔一次)保存项目并重新启动 VS2008 似乎已经“修复”了它。该错误是内部链接器错误(引用了 mms 库)。


0
投票

我不知道它是如何工作的,但添加到预处理器选项

_WINSOCKAPI_

解决了所有巨大解决方案中的多个重新定义

© www.soinside.com 2019 - 2024. All rights reserved.