2012-11-23 38 views
5

Hãy chương trình đơn giản nàyDữ liệu nhập chứa với MinGW-w64

#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

int 
main (void) 
{ 
    printf ("ERROR %d %s\n", ETIMEDOUT, strerror (ETIMEDOUT)); 
    return 0; 
} 

Nếu bạn biên dịch nó với Cygwin gcc nó chạy tốt

$ gcc a.c 

$ ./a 
ERROR 116 Connection timed out 

Nếu bạn biên dịch nó với MinGW-w64 gcc nó không cung cấp cho phù hợp thông báo lỗi

$ i686-w64-mingw32-gcc a.c 

$ ./a 
ERROR 138 Unknown error 

Làm thế nào tôi có thể yêu cầu MinGW-w64 đặt đúng thông báo lỗi?

+1

Một số mẩu tin bổ sung về 'ETIMEDOUT': ít nhất một trong các cài đặt MinGW của tôi định nghĩa nó là '10060' (giống với' WSAETIMEDOUT') thay vì '138' nếu chưa được xác định. Tôi nghĩ rằng điều này là do di sản 'winsock.h' được sử dụng để làm điều đó (nhưng không còn nữa). Boost sẽ định nghĩa nó là '9938' nếu trình biên dịch 'cerrno' chưa định nghĩa nó - điều này không bắt đầu xảy ra trong MSVC cho đến VS2010. Vì vậy, tôi muốn nói rằng bạn có thể xem xét cho mình một chút may mắn bạn thậm chí có được chương trình để biên dịch. –

+0

@MichaelBurr - WinSock đã mượn WSAETIMEDOUT (10060) từ Berkeley Sockets theo http://www.sockets.com/err_lst1.htm#WSAETIMEDOUT –

Trả lời

2

ETIMEDOUT dường như là một phần mở rộng POSIX đối với tiêu chuẩn ISO C errno.h. Cygwin có hỗ trợ tốt hơn cho POSIX so với MinGW. Báo cáo lỗi về số ETIMEDOUT cho mingw32 đã được mở và đóng trong 2007.

Một tùy chọn là sử dụng Thư viện khả năng di động GNU (Gnulib). Nó cung cấp một POSIX giống như errno.hstrerror()/strerror_override().

Các vấn đề liên quan