MinGW не определяет WIN32, ошибка в директивах препроцессора - PullRequest
9 голосов
/ 27 января 2012

Я использую mingw32-make для компиляции проекта в Windows, который зависит от проекта под названием libevent2. Я продолжаю получать эту ошибку -

util.h:69:25: fatal error: sys/socket.h: No such file or directory

Очевидно, что файл из Linux API пытается быть включенным, что не будет работать в Windows. Однако после дальнейшего изучения я обнаружил, что этот файл следует включать, только если WIN32 не определен.

#ifdef WIN32
 #include <winsock2.h>
#else
 #include <sys/socket.h>
#endif

Ответы [ 2 ]

13 голосов
/ 27 января 2012

Вы должны использовать _WIN32 и, возможно, захотите проверить __CYGWIN__

#if defined _WIN32 || defined __CYGWIN__
9 голосов
/ 27 января 2012

Вы уверены, что нет ничего неопределенного WIN32? Моя установка MinGW (4.6.1 на этом сайте) определенно определяет это:

C:\temp>gcc -E -dM test.c | find /i "win"
#define _WIN32 1
#define __WINT_MAX__ 65535
#define _WINT_T
#define __WINT_MIN__ 0
#define __WIN32 1
#define __WINNT 1
#define __WINNT__ 1
#define __WIN32__ 1
#define __SIZEOF_WINT_T__ 2
#define WIN32 1                 // <-- right here
#define __WINT_TYPE__ short unsigned int
#define WINNT 1

Попробуйте передать параметры -E -dM, чтобы убедиться, что ваш компилятор MinGW (или нет) предварительно определяет макрос WIN32.

Обратите внимание, что, строго говоря, WIN32 должен не быть предопределенным компилятором (поскольку он находится в пространстве имен пользователя) - только _WIN32. WIN32 должен быть установлен используемым SDK и / или средой сборки - так работает он в компиляторах Microsoft.

Например, в windef.h "

есть следующая последовательность
#ifndef WIN32
#define WIN32
#endif

и /D "WIN32" по умолчанию помещаются в проекты Visual Studio C ++.

Подробнее см. https://stackoverflow.com/a/662543/12711.

...