【发布时间】: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