错误 C2011:'sockaddr':'struct' 类型重新定义。参见 'sockaddr' 的声明
error C2011: 'sockaddr' : 'struct' type redefinition. see declaration of 'sockaddr'
我使用 Visual Studio 2012 并尝试让静态库 UDT 开始工作。不幸的是,我无法编译将 UDT 库链接到自身的项目,我在 windows SDK headers.
中收到 159 个关于类型或宏重新定义的奇怪错误
c:\program files\windows kits.0\include\shared\ws2def.h(96): warning C4005: 'AF_IPX' : macro redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(452) : see previous definition of 'AF_IPX'
2>c:\program files\windows kits.0\include\shared\ws2def.h(136): warning C4005: 'AF_MAX' : macro redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(471) : see previous definition of 'AF_MAX'
2>c:\program files\windows kits.0\include\shared\ws2def.h(173): warning C4005: 'SO_DONTLINGER' : macro redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(394) : see previous definition of 'SO_DONTLINGER'
2>c:\program files\windows kits.0\include\shared\ws2def.h(217): error C2011: 'sockaddr' : 'struct' type redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(477) : see declaration of 'sockaddr'
之前删除了一些为每个 UDT 函数定义 dllexport/dllimport 的代码:
#define UDT_API // no dllimport/export
我检查过库总是使用#ifdef 来检查文件是否已经包含。
这个错误:
windows kits.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);
我缺少什么?
如果您包含 winsock.h 和 winsock2.h,请确保首先包含 winsock2.h。如果包含不是很明显,你可以检查有问题的 cpp 文件,如果你 compile them with /P 并遍历生成的预处理器输出文件。
只是为了描述问题所在...似乎我不应该在任何 winsock
headers 之前包含 udt.h
。这就是解决方法:
#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
我使用 Visual Studio 2012 并尝试让静态库 UDT 开始工作。不幸的是,我无法编译将 UDT 库链接到自身的项目,我在 windows SDK headers.
中收到 159 个关于类型或宏重新定义的奇怪错误c:\program files\windows kits.0\include\shared\ws2def.h(96): warning C4005: 'AF_IPX' : macro redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(452) : see previous definition of 'AF_IPX'
2>c:\program files\windows kits.0\include\shared\ws2def.h(136): warning C4005: 'AF_MAX' : macro redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(471) : see previous definition of 'AF_MAX'
2>c:\program files\windows kits.0\include\shared\ws2def.h(173): warning C4005: 'SO_DONTLINGER' : macro redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(394) : see previous definition of 'SO_DONTLINGER'
2>c:\program files\windows kits.0\include\shared\ws2def.h(217): error C2011: 'sockaddr' : 'struct' type redefinition
2> c:\program files\windows kits.0\include\um\winsock.h(477) : see declaration of 'sockaddr'
之前删除了一些为每个 UDT 函数定义 dllexport/dllimport 的代码:
#define UDT_API // no dllimport/export
我检查过库总是使用#ifdef 来检查文件是否已经包含。 这个错误:
windows kits.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);
我缺少什么?
如果您包含 winsock.h 和 winsock2.h,请确保首先包含 winsock2.h。如果包含不是很明显,你可以检查有问题的 cpp 文件,如果你 compile them with /P 并遍历生成的预处理器输出文件。
只是为了描述问题所在...似乎我不应该在任何 winsock
headers 之前包含 udt.h
。这就是解决方法:
#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