C 函数的隐式声明';getaddrinfo';论明
我有一个C程序,它使用C 函数的隐式声明';getaddrinfo';论明,c,winapi,mingw,winsock2,getaddrinfo,C,Winapi,Mingw,Winsock2,Getaddrinfo,我有一个C程序,它使用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-funct
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()
现在,根据,Windows支持getaddrinfo()
,它位于头文件ws2tcip.h
和库文件Ws2_32.lib
中
我正在使用
ws2tcip.h
并链接到-lWs2_32
,因此我不确定为什么这不起作用。如果您查看ws2tcip.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
只需在包含之前定义
\u WIN32\u WINNT
。解决此问题的正确方法是:
#define WINVER WindowsXP
或者更明智地将-DWINVER=WindowsXP
添加到您的CPPFLAGS
参考:
注意:但对我不起作用。如果你想让你的代码编译器更广泛,你实际上也应该用与
\u WIN32\u WINNT
相同的操作系统版本定义NTDDI\u版本。如果没有这一定义,仅定义\u WIN32\u WINNT
将不允许您在某些编译器(如Watcom)中使用getaddrinfo()
。最好以与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