C++ 错误C2011:&x27;sockaddr';:';结构';类型重新定义。见'宣言;sockaddr';
我使用VisualStudio2012,试图让静态库开始工作。不幸的是,我无法编译将UDT库链接到自身的项目,我在WindowsSDK头中得到了159个关于类型或宏重新定义的奇怪错误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
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