Linux下MinGW64可编译的Windows系统版本代码在Windows编译失败原因咨询
解决Windows本地编译时
NTSTATUS未定义的问题 这个问题的核心原因是Windows本地编译器(比如MSVC)和MinGW64的头文件处理逻辑不同:
为什么MinGW64能正常编译?
MinGW64的头文件集合默认就暴露了NT内核相关的类型(比如NTSTATUS)和未公开函数的声明,不需要额外的预处理器宏就能让这些定义生效,所以你的代码在Linux下用MinGW交叉编译时能顺利通过。
为什么Windows本地编译报错?
Windows的官方编译器(MSVC)中,NTSTATUS这类NT内核专属的类型定义,以及RtlGetVersion相关的声明,默认不会通过windows.h暴露出来——你需要提前定义特定的预处理器宏,才能让windows.h包含这些底层NTAPI的内容。
具体来说,NTSTATUS定义在ntstatus.h中,而这个头文件只有在定义了_WIN32_WINNT宏且版本值足够高时,才会被windows.h间接包含。
解决方案
1. 添加预处理器宏
在包含windows.h之前,定义_WIN32_WINNT宏为至少Windows XP对应的版本值(0x0501),或者更高版本,比如Windows 10的0x0A00:
// 放在所有头文件包含之前 #define _WIN32_WINNT 0x0501 #include <windows.h> #include <string> #include <sstream> // 你的get_os函数代码...
这个宏会告诉编译器,你要针对指定版本的Windows SDK编译,从而启用对应版本的内核API和类型定义。
2. (可选)直接包含头文件
如果你不想依赖_WIN32_WINNT宏,也可以直接在代码中包含ntstatus.h:
#include <ntstatus.h> #include <windows.h> #include <string> #include <sstream>
不过更推荐第一种方式,因为它更符合Windows SDK的规范,避免头文件依赖冲突。
额外注意点
- 你代码中对Windows 5.2的判断标注为"Windows XP Professional"其实不准确,5.2对应的是Windows Server 2003或Windows XP x64版本,建议修正这部分逻辑。
- 对于Windows 10及以上版本,
dwMajorVersion始终是10,dwMinorVersion为0,不同的更新版本需要通过osInfo.dwBuildNumber来区分,如果你需要更精确的版本信息,可以扩展这部分逻辑。
内容的提问来源于stack exchange,提问作者Lynx




