2012-10-07 45 views
5

Tengo un programa en C que usa getaddrinfo(). Funciona como se esperaba en Linux y Mac OS X.Declaración implícita de la función 'getaddrinfo' en MinGW

Estoy en el medio de portarlo a Windows.

Cuando compilo (con MinGW gcc) consigo las siguientes advertencias:

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] 

Entonces toda la cosa no se puede vincular con referencias indefinidas a getaddrinfo() y freeaddrinfo().

Ahora, de acuerdo con this MSDN page, getaddrinfo() es compatible con Windows y se encuentra en el archivo de cabecera Ws2tcpip.h y el archivo de biblioteca Ws2_32.lib.

Estoy incluyendo Ws2tcpip.h y vinculo con -lWs2_32, así que no estoy seguro de por qué esto no está funcionando.

Respuesta

10

Si mira la línea 297 de ws2tcpip.h, puede ver que hay una comprobación del valor de _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 

Just #define _WIN32_WINNT antes de su lo incluye.

0

Si desea hacer que su código compilador en general, también debe definir NTDDI_VERSION con la misma versión de sistema operativo que _WIN32_WINNT. Sin esa definición, solo _WIN32_WINNT no le permitirá usar getaddrinfo() con algunos compiladores (es decir, Watcom). Es mejor ajustarlo de la misma manera que 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 
Cuestiones relacionadas