2012-10-07 13 views
5

Ich habe ein C-Programm, das getaddrinfo() verwendet. Es funktioniert wie erwartet unter Linux und Mac OS X.Implizite Erklärung der Funktion 'getaddrinfo' auf MinGW

Ich bin in der Mitte der Portierung auf Windows.

Wenn ich es kompilieren (mit MinGW gcc) Ich erhalte die folgenden Warnungen:

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] 

Dann wird die ganze Sache irgendwie nicht definiert Hinweise auf getaddrinfo() und freeaddrinfo() zu verknüpfen.

nun nach this MSDN page wird getaddrinfo() unter Windows unterstützt und wird in der Header-Datei Ws2tcpip.h und die Bibliotheksdatei Ws2_32.lib befindet.

Ich bin einschließlich Ws2tcpip.h und Verknüpfung mit -lWs2_32, so dass ich nicht sicher bin, warum das nicht funktioniert.

Antwort

10

Wenn Sie sich Zeile 297 von ws2tcpip.h ansehen, können Sie sehen, dass der Wert von _WIN32_WINNT überprüft wird.

#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 

Gerade #define _WIN32_WINNT vor Ihrer enthält.

0

Wenn Sie Ihren Code Compiler-weit machen möchten, sollten Sie auch NTDDI_VERSION mit der gleichen Betriebssystemversion wie _WIN32_WINNT definieren. Ohne diese Definition nur _WIN32_WINNT können Sie nicht mit einigen Compilern getaddrinfo() (d. H. Watcom) verwenden. Es ist besser, es wie das Windows SDK zu umbrechen:

#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