2012-11-23 13 views
5

prendere questo semplice programmastrerror con MinGW-W64

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

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

Se si compila con Cygwin gcc funziona benissimo

$ gcc a.c 

$ ./a 
ERROR 116 Connection timed out 

Se si compila con MinGW-W64 gcc non dà adeguata messaggio di errore

$ i686-w64-mingw32-gcc a.c 

$ ./a 
ERROR 138 Unknown error 

Come posso ottenere MinGW-w64 per inserire il messaggio di errore corretto?

+1

Alcune informazioni aggiuntive su 'ETIMEDOUT': almeno una delle mie installazioni MinGW la definisce come' 10060' (uguale a 'WSAETIMEDOUT') invece di' 138' se non è già definita. Penso che questo sia dovuto al fatto che il precedente 'winsock.h' lo faceva (ma non lo fa più). Boost lo definirà come '9938' se il' cerrno' del compilatore non lo definisce già - cosa che non iniziò a succedere in MSVC fino a VS2010. Quindi, direi che potresti considerarti un po 'fortunato che hai persino il programma da compilare. –

+0

@MichaelBurr - WinSock ha preso in prestito WSAETIMEDOUT (10060) da Berkeley Sockets in base a http://www.sockets.com/err_lst1.htm#WSAETIMEDOUT –

risposta

2

ETIMEDOUT sembra essere un'estensione POSIX allo standard ISO C errno.h. Cygwin offre un supporto migliore per POSIX rispetto a MinGW. Un bug report su ETIMEDOUT per mingw32 è stato aperto e chiuso in 2007.

Un'opzione è utilizzare la libreria di portabilità GNU (Gnulib). Fornisce un errno.h tipo POSIX e strerror()/strerror_override().