【问题标题】:error C2011: 'sockaddr' : 'struct' type redefinition. see declaration of 'sockaddr' [duplicate]错误 C2011:“sockaddr”:“struct”类型重新定义。见“sockaddr”的声明[重复]
【发布时间】:2015-07-15 15:23:19
【问题描述】:

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

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);

我缺少什么?

【问题讨论】:

  • 如果没有重现问题的最小代码,我们该怎么办?
  • @Jepessen 没有代码,如果有#include "udt.h",我就无法构建项目。您可以点击链接,下载存档,解压缩,在 Visual Studio 中打开并将udt 构建类型更改为static library。然后删除dllimport/dllexport 表达式(有两个,很容易找到),应该只是#define UDT_API。然后将udt链接到其他空项目并在其中执行include "udt.h"....这就是我所做的
  • 我记得在包含 windows.h 之前定义 WIN32_LEAN_AND_MEAN 的一些事情,因为它已经包含 winsock 并且似乎存在其他问题。这是这样的场景吗?我目前不知道,因此这是一条评论,没有答案...
  • @PuerNoctis 你给我指出了正确的方向,现在我可以编译我的两个项目,但我不能编写 UDT 代码,因为我不能在我的代码中包含 winsock 的东西。如果我输入 #include <winsock2.h>#include <ws2tcpip.h>#include <wspiapi.h>,我会得到相同的错误
  • Windows 因对包含文件的顺序挑剔而臭名昭著。我认为糟糕的设计。

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


【解决方案1】:

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

【讨论】:

  • 刚刚阅读了stackoverflow.com/questions/22517036/…,不,这没有帮助..如果我尝试包含任何 winsock 标头,我会收到 159 个错误(如链接问题)
  • 你检查过/P吗?
  • UDT 还是我的项目?使用 /P 构建后我应该在哪里以及 什么 观看?
  • /P 用于其中一个(任何你喜欢的)无法编译的文件。
  • 分享解决我问题的方法: 1. 打开#include hierarchy(stackoverflow.com/questions/1137966/…)。 2.重新排序包含解决问题:我的问题是由于windows.h后包含winsoc2.h(sysnet.pe.kr/2/0/12438)
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多