2012-10-07 35 views
5

Tôi có chương trình C sử dụng getaddrinfo(). Nó hoạt động như mong đợi trên Linux và Mac OS X.Tuyên bố ngầm định về chức năng 'getaddrinfo' trên MinGW

Tôi đang chuyển nó sang Windows.

Khi tôi biên dịch nó (với MinGW gcc) tôi nhận được những lời cảnh báo sau đây:

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] 

Sau đó, toàn bộ điều không liên kết với tài liệu tham khảo không xác định để getaddrinfo()freeaddrinfo().

Hiện tại, theo this MSDN page, getaddrinfo() được hỗ trợ trên Windows và nằm trong tệp tiêu đề Ws2tcpip.h và tệp thư viện Ws2_32.lib.

Tôi đang bao gồm Ws2tcpip.h và liên kết với -lWs2_32, vì vậy tôi không chắc chắn lý do tại sao tính năng này không hoạt động.

Trả lời

10

Nếu bạn có một cái nhìn tại dòng 297 của ws2tcpip.h, bạn có thể thấy rằng có một kiểm tra giá trị của _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 

Chỉ cần #define _WIN32_WINNT trước khi bao gồm.

0

Nếu bạn muốn làm cho toàn bộ trình biên dịch mã, bạn cũng nên xác định NTDDI_VERSION với cùng phiên bản hệ điều hành là _WIN32_WINNT. Nếu không có việc xác định chỉ _WIN32_WINNT sẽ không cho phép bạn sử dụng getaddrinfo() với một số trình biên dịch (ví dụ: Watcom). Tốt hơn là bọc nó theo cách tương tự như 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 
Các vấn đề liên quan