2012-01-26 206 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