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

7
我使用Visual Studio 2012,尝试让静态库UDT正常工作。不幸的是,我不能编译将UDT库链接到自身的项目,我会收到159个奇怪的错误,这些错误涉及Windows SDK头文件中的类型或宏重定义。

c:\program files\windows kits\8.0\include\shared\ws2def.h(96): warning 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): warning C4005: 'AF_MAX' : 宏重定义 2> c:\program files\windows kits\8.0\include\um\winsock.h(471) : 查看“AF_MAX”的先前定义 2>c:\program files\windows kits\8.0\include\shared\ws2def.h(173): warning C4005: 'SO_DONTLINGER' : 宏重定义 2> c:\program files\windows kits\8.0\include\um\winsock.h(394) : 查看“SO_DONTLINGER”的先前定义 2>c:\program files\windows kits\8.0\include\shared\ws2def.h(217): error 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 检查文件是否已经被包含。而且出现了以下错误: 可能的原因是在 udt 中的某个地方使用了 const 关键字。
UDT_API int bind(UDTSOCKET u, const struct sockaddr* name, int namelen);

什么我错过了?

没有一个能够重现问题的最小代码,我们能做些什么呢? - Jepessen
@Jepessen,这里没有代码,但如果它包含#include "udt.h",我就无法构建项目。您可以按照链接,下载存档文件,解压缩,打开Visual Studio并将udt的构建类型更改为“静态库”。然后删除dllimport / dllexport表达式(有两个,很容易找到),应该只是#define UDT_API。然后将udt链接到其他空项目中,并在其中执行include "udt.h"...这就是我所做的。 - Croll
3
在包含 windows.h 之前定义 WIN32_LEAN_AND_MEAN,因为它已经包含了 winsock,否则可能会出现问题。这是否适用于此情况?我暂时不知道,因此这只是一条评论而非答案... - PuerNoctis
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Croll
Windows 以挑剔 include 文件的顺序而闻名。在我看来,这是一个糟糕的设计。 - dbush
2个回答

13
如果你包含了winsock.h和winsock2.h,请确保先包含winsock2.h。如果这些包含不太明显,你可以检查相关的cpp文件,使用/P编译它们并浏览生成的预处理器输出文件。

刚刚阅读了https://dev59.com/3Oo6XIcBkEYKwwoYJA7p,但是并没有帮助。如果我尝试包含任何winsock头文件,我会得到159个错误(就像链接的问题中一样)。 - Croll
你用 /P 检查了吗? - Werner Henze
使用 /P 标志来标记其中一个无法编译的文件。 - Werner Henze
我刚刚又遇到了这个愚蠢的错误。http://pastebin.com/6V5RdjQV 我不明白它是什么意思。 - Croll
1
分享一下解决我的问题的方法:
  1. 打开 #include 层次结构(https://dev59.com/6nM_5IYBdhLWcg3w-4nw:~:text=It's%20under%20Project%20Settings%20%2D%3E%20Configuration,%3E%20Advanced%20%2D%3E%20Show%20Includes.)。
  2. 重新排列包含文件以解决问题:我的问题是由于在 windows.h(https://www.sysnet.pe.kr/2/0/12438) 之后包含了 winsoc2.h。
- run run chicken
显示剩余2条评论

2

仅仅是描述问题...似乎在任何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

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