2012-01-26 205 views
7

我正在使用mingw32-make編譯項目到Windows,該項目取決於名爲libevent2的項目。我一直收到這個錯誤 -MinGW未定義WIN32,預處理器指令中的錯誤

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 
+0

」您的項目「 ?確保WIN32被定義,''需要cygwin,而不僅僅是mingw32。 – John

+0

@John對不起,'一個項目'你是什麼意思'確保WIN32被定義?' – liamzebedee

+0

什麼MinGW的rsion是否在使用?什麼是調用編譯器的命令行? –

回答

9

您應該使用_WIN32並且可能還需要檢查__CYGWIN__

#if defined _WIN32 || defined __CYGWIN__ 
9

你肯定有什麼取消定義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