C++ 错误C2011:&x27;sockaddr';:';结构';类型重新定义。见'宣言;sockaddr';

C++ 错误C2011:&x27;sockaddr';:';结构';类型重新定义。见'宣言;sockaddr';,c++,windows,sockets,visual-studio-2012,static-linking,C++,Windows,Sockets,Visual Studio 2012,Static Linking,我使用VisualStudio2012,试图让静态库开始工作。不幸的是,我无法编译将UDT库链接到自身的项目,我在WindowsSDK头中得到了159个关于类型或宏重新定义的奇怪错误 c:\program files\windows kits\8.0\include\shared\ws2def.h(96):警告C4005:'AF_IPX':宏重新定义 2> c:\program files\windows kits\8.0\include\um\winsock.h(452):请参阅“AF_IPX

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

c:\program files\windows kits\8.0\include\shared\ws2def.h(96):警告C4005:'AF_IPX':宏重新定义
2> c:\program files\windows kits\8.0\include\um\winsock.h(452):请参阅“AF_IPX”的先前定义
2> c:\program files\windows kits\8.0\include\shared\ws2def.h(136):警告C4005:'AF_MAX':宏重新定义
2> c:\program files\windows kits\8.0\include\um\winsock.h(471):请参阅前面对“AF\u MAX”的定义
2> c:\program files\windows kits\8.0\include\shared\ws2def.h(173):警告C4005:“SO_DONTLINGER”:宏重新定义
2> c:\program files\windows kits\8.0\include\um\winsock.h(394):请参阅前面对“SO\u DONTLINGER”的定义
2> c:\program files\windows kits\8.0\include\shared\ws2def.h(217):错误C2011:'sockaddr':'struct'类型重新定义
2> c:\program files\windows kits\8.0\include\um\winsock.h(477):请参阅“sockaddr”的声明。

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

#define UDT_API // no dllimport/export
我检查了库是否总是使用#ifdef检查文件是否已经包含在内。 这个错误是:

windows工具包\8.0\include\um\ws2tcip.h(703):错误C3861:'WSASetLastError':找不到标识符

原因可能是该表达式中的
const
关键字(udt中的某个位置):


我缺少什么?

如果包含winsock.h和winsock2.h,请确保首先包含winsock2.h。如果包含的内容不太明显,您可以检查有问题的cpp文件,如果您仔细查看生成的预处理器输出文件。

仅描述问题所在。。。似乎我不应该在任何
winsock
标题之前包含
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
\ifndef WIN32
#包括
#包括
#包括
#包括
#否则
#定义WIN32_精益_和_平均值
#包括
#包括
#包括
#恩迪夫
#包括
#包括
#包括
#包括
#ifndef WIN32
无效*记录数据(无效*);
#否则
DWORD WINAPI recvdata(LPVOID);
#恩迪夫

如果没有重现问题的最小代码,我们能做什么?@Jepessen没有代码,如果它包含“udt.h”,我就无法构建项目。您可以按照链接,下载存档,卸载,在visual studio中打开,并将
udt
构建类型更改为
static library
。然后删除
dllimport/dllexport
表达式(这两个表达式很容易找到),并且应该是
#define udt\u API
。然后将udt链接到其他空项目,并在其中包含“udt.h”。。。。这就是我所做的我记得在包含
windows.h
之前定义
WIN32\u LEAN\u和
,因为它已经包含
winsock
,而且在其他方面似乎有问题。这是一种情况吗?我现在不知道,因此这是一个评论,没有答案…@PuerNoctis你为我指出了一个正确的方向,现在我可以编译我的两个项目,但我不能编写UDT代码,因为我不能在代码中包含winsock内容。如果我键入
#include
#include
#include
,我会得到同样的错误,因为斯温多斯对include文件的顺序非常挑剔。在我看来,糟糕的设计。我刚刚读过,没有,这没有帮助。如果我尝试包含任何winsock头,我会收到159个错误(如链接问题中的错误)。您是否检查了
/P
?UDT或我的项目?在使用/P构建之后,我应该在何处观看以及观看哪些内容?使用
/P
查看一个(任何您喜欢的)无法编译的文件。我只是得到了另一个愚蠢的错误。我不明白这是什么意思。
 #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