VS2008编译错误,涉及<winsock2.h>。

8
当我包含<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

任何建议都将不胜感激。
3个回答

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

原来在项目的另一个.h文件中,以及在上述.h文件之前,调用了<windows.h>。熬夜编码就是这样,谢谢你的帮助,非常感激。

我将那个<windows.h>的调用替换为<winsock2.h>,现在它工作得很好。

不过,在此之后,<mmsystem.h> 的include随机出现问题(每隔一次编译)。我已经用 #ifdef _WIN32 将其封装起来,但似乎仍然是随机的。保存最后一次成功编译(每隔一次的情况)之后并重新启动VS2008似乎已经“修复”了它。错误是一个内部链接器错误(mms lib被引用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接