Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数的隐式声明';getaddrinfo';论明_C_Winapi_Mingw_Winsock2_Getaddrinfo - Fatal编程技术网

C 函数的隐式声明';getaddrinfo';论明

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

我有一个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-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