6

我有一个使用getaddrinfo(). 它在 Linux 和 Mac OS X 上按预期工作。

我正在将其移植到 Windows 中。

当我编译它(使用 MinGW gcc)时,我收到以下警告:

ext/socket/socket.c: In function 'sl_tcp_socket_init':
ext/socket/socket.c:98:5: warning implicit declaration of function 'getaddrinfo' [-Wimplicit-function-declaration]
ext/socket/socket.c:104:9: warning implicit declaration of function 'freeaddrinfo' [-Wimplicit-function-declaration]

然后整个事情无法与未定义的引用链接getaddrinfo()freeaddrinfo()

现在,根据这个 MSDN 页面getaddrinfo()在 Windows 上受支持,位于头文件Ws2tcpip.h和库文件Ws2_32.lib中。

我包含Ws2tcpip.h并链接到-lWs2_32,所以我不确定为什么这不起作用。

4

3 回答 3

11

如果您查看 ws2tcpip.h 的第 297 行,您可以看到检查了 _WIN32_WINNT 的值。

#if (_WIN32_WINNT >= 0x0501)
void WSAAPI freeaddrinfo (struct addrinfo*);
int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*,
                struct addrinfo**);
int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
               char*,DWORD,int);
#else
/* FIXME: Need WS protocol-independent API helpers.  */
#endif

只需在包含之前#define _WIN32_WINNT

于 2012-10-07T03:19:34.880 回答
0

如果你想让你的代码在编译器范围内,你实际上也应该NTDDI_VERSION使用与_WIN32_WINNT. 如果没有这个定义,_WIN32_WINNT您将无法使用getaddrinfo()某些编译器(即 Watcom)。最好以与 Windows SDK 相同的方式包装它:

#define _NTDDI_VERSION_FROM_WIN32_WINNT2(ver)    ver##0000
#define _NTDDI_VERSION_FROM_WIN32_WINNT(ver)     _NTDDI_VERSION_FROM_WIN32_WINNT2(ver)

#ifndef _WIN32_WINNT
#  define _WIN32_WINNT 0x501
#endif
#ifndef NTDDI_VERSION
#  define NTDDI_VERSION _NTDDI_VERSION_FROM_WIN32_WINNT(_WIN32_WINNT)
#endif
于 2016-06-13T20:19:41.137 回答
-1

据说解决这个问题的正确方法是:

#define WINVER WindowsXP

或者也许更明智地添加-DWINVER=WindowsXP到您的CPPFLAGS.

参考: http: //mingw.5.n7.nabble.com/Undefined-reference-to-getaddrinfo-td5694.html

注意:但是对我不起作用。

于 2013-05-23T14:31:50.170 回答