错误C2011:'sockaddr':'struct'类型重新定义。看到'sockaddr'的声明

时间:2015-07-15 15:23:20

标签: c++ windows sockets visual-studio-2012 static-linking

我使用Visual Studio 2012并试图让静态库UDT开始工作。不幸的是,我无法编译将UDT lib链接到自身的项目,我在Windows SDK头文件中获得了159个关于类型或宏重新定义的奇怪错误。

c:\program files\windows kits\8.0\include\shared\ws2def.h(96): warning C4005: 'AF_IPX' : macro redefinition 2> c:\program files\windows kits\8.0\include\um\winsock.h(452) : see previous definition of 'AF_IPX' 2>c:\program files\windows kits\8.0\include\shared\ws2def.h(136): warning C4005: 'AF_MAX' : macro redefinition 2> c:\program files\windows kits\8.0\include\um\winsock.h(471) : see previous definition of 'AF_MAX' 2>c:\program files\windows kits\8.0\include\shared\ws2def.h(173): warning C4005: 'SO_DONTLINGER' : macro redefinition 2> c:\program files\windows kits\8.0\include\um\winsock.h(394) : see previous definition of 'SO_DONTLINGER' 2>c:\program files\windows kits\8.0\include\shared\ws2def.h(217): error C2011: 'sockaddr' : 'struct' type redefinition 2> c:\program files\windows kits\8.0\include\um\winsock.h(477) : see declaration of 'sockaddr'

之前删除了一些为每个UDT函数定义dllexport / dllimport的代码:

#define UDT_API // no dllimport/export

我检查过该库总是使用#ifdef来检查文件是否已经包含在内。 这个错误:

windows kits\8.0\include\um\ws2tcpip.h(703): error C3861: 'WSASetLastError': identifier not found

可能在该表达式中有const关键字(在udt内的某处):

UDT_API int bind(UDTSOCKET u, const struct sockaddr* name, int namelen);

我缺少什么?

2 个答案:

答案 0 :(得分:5)

如果包含winsock.h和winsock2.h,请确保首先包含winsock2.h。如果包含不那么明显,您可以检查有问题的cpp文件compile them with /P并浏览生成的预处理器输出文件。

答案 1 :(得分:1)

只是为了描述什么问题...似乎我不应该在任何udt.h标头之前包含winsock。这是修复:

 #ifndef WIN32
   #include <unistd.h>
   #include <cstdlib>
   #include <cstring>
   #include <netdb.h>
   #else
   #define WIN32_LEAN_AND_MEAN
    #include <WinSock2.h>
    #include <WS2tcpip.h>
    #include <Windows.h>
   #endif

   #include <udt.h>
   #include <singleton.h>
   #include <excassert.h>
   #include <SharedUtility.h>

   #ifndef WIN32
   void* recvdata(void*);
   #else
   DWORD WINAPI recvdata(LPVOID);
   #endif