我在Windows 7上使用MinGW GCC编译器。我正在尝试编译包含以下代码的源代码:
MEMORYSTATUSEX mem_stat;
mem_stat.dwLength = sizeof(memstat);
BOOL success = GlobalMemoryStatusEx(mem_stat);
ram_ptr = &(mem_stat->ullAvailPhys);
我确信你可以猜到,这段代码只是使用GlobalMemoryStatusEx返回的MEMORYSTATUSEX结构获取可用内存。
当我尝试编译时,我收到此错误:
error: unknown type name 'MEMORYSTATUSEX'
我查看了winbase.h(在MinGW安装包含文件夹中)并猜测我发现了什么?
#if (_WIN32_WINNT >= 0x0500)
typedef struct _MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX,*LPMEMORYSTATUSEX;
#endif
所以就在那里。我猜这与预编译器if / endif有关,但我不知道如何解决这个问题....
更令人头疼的是,如果我使用MEMORYSTATUS结构,它可以正常工作。
根据MS文档,两者都具有相同的最低客户端版本要求:
MEMORYSTATUSEX: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx
MEMORYSTATUS: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366772%28v=vs.85%29.aspx
我需要设置一些编译器标志吗?或者有没有人有其他解决方案?
提前感谢您的帮助!
答案 0 :(得分:2)
在包含Windows.h之前,添加:
#define WINVER 0x0500
头文件windef.h说:
/*
* If you need Win32 API features newer the Win95 and WinNT then you must
* define WINVER before including windows.h or any other method of including
* the windef.h header.
*/
然后使用-std = c ++ 11标志进行编译,如:
g++ -Wall -std=c++11 -c <yourFile>.cpp -o <yourFile>.o
答案 1 :(得分:0)
显然你必须自己定义_WIN32_WINNT作为你的一个头/源文件中的编译器标志或定义语句,以使这个特定的函数正常工作。
添加#define _WIN32_WINNT 0x0500
将允许代码正常编译。