MinGW

2012-10-07 12 views
5

पर फ़ंक्शन 'getaddrinfo' की लागू घोषणा मेरे पास एक सी प्रोग्राम है जो getaddrinfo() का उपयोग करता है। यह लिनक्स और मैक ओएस एक्स पर अपेक्षित काम करता है।MinGW

मैं इसे विंडोज़ में पोर्ट करने के बीच में हूं।

जब मैं यह संकलन (MinGW जीसीसी) के साथ मैं निम्नलिखित चेतावनी मिलती है:

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() को अपरिभाषित संदर्भ के साथ लिंक करने के लिए विफल रहता है।

अब, this MSDN page के अनुसार, getaddrinfo() Windows पर समर्थित है और हेडर फाइल Ws2tcpip.h और पुस्तकालय फ़ाइल Ws2_32.lib में स्थित है।

मैं Ws2tcpip.h और -lWs2_32 से लिंक कर रहा हूं, इसलिए मुझे यकीन नहीं है कि यह क्यों काम नहीं कर रहा है।

उत्तर

10

यदि आपके पास 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 

बस #अपने शामिल होने से पहले परिभाषित करें।

-1

माना जाता है इसे ठीक करने के लिए उचित तरीका है:

#define WINVER WindowsXP 

या शायद अधिक समझदारी से अपने CPPFLAGS को -DWINVER=WindowsXP जोड़ने।

रेफरी: http://mingw.5.n7.nabble.com/Undefined-reference-to-getaddrinfo-td5694.html

नोट: हालांकि मेरे लिए काम नहीं किया।

0

यदि आप अपना कोड कंपाइलर-चौड़ा बनाना चाहते हैं तो आपको वास्तव में NTDDI_VERSION को उसी ओएस संस्करण के साथ _WIN32_WINNT के रूप में परिभाषित करना चाहिए। केवल _WIN32_WINNT को परिभाषित करने के बिना आपको कुछ कंपाइलर्स (यानी Watcom) के साथ getaddrinfo() का उपयोग करने की अनुमति नहीं दी जाएगी। विंडोज एसडीके के रूप में इसे लपेटना बेहतर है:

#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