You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动