_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
在我的编译过程中不断弹出这个错误。它似乎不影响编译,但我应该如何摆脱它?我是否会因为忽略它而冒任何风险?
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
在我的编译过程中不断弹出这个错误。它似乎不影响编译,但我应该如何摆脱它?我是否会因为忽略它而冒任何风险?
将其设置为您希望程序运行的最旧的 Windows 操作系统。此 MSDN 文章Using the Windows Headers中给出了可能的值。
#define
您可以通过使用每个源文件中的语句或通过指定/D
Visual C++ 支持的编译器选项来定义这些符号。例如,要
WINVER
在源文件中设置,请使用以下语句:#define WINVER 0x0502 // Windows Server 2003 with SP1, Windows XP with SP2
要
_WIN32_WINNT
在源文件中设置,请使用以下语句:#define _WIN32_WINNT 0x0502 // Windows Server 2003 with SP1, Windows XP with SP2
要
_WIN32_WINNT
使用/D
编译器选项进行设置,请使用以下命令:cl -c /D_WIN32_WINNT=0x0502 source.cpp
它是通过 WinSDKVer.h 为您定义的。因此,只需在源代码的顶部明确定义它(例如在 stdafx.h 的开头),您就会摆脱警告。
将其定义为相同的值(与_WIN32_WINNT_MAXVER
WinSDKVer.h 相比)不太可能破坏任何内容。
例如,适用于 Windows 7 和 .NET Framework 3.5 Service Pack 1 的 Windows® 软件开发工具包 (SDK) 的 WinSDKVer.h 包含:
// This list contains the highest version constants supported by content
// in the Windows SDK.
// [...]
#define _WIN32_WINNT_MAXVER 0x0601
解决这个问题的方法和可能使用的值的链接可以在我用来解决问题的 user93353 的超级答案中找到。
https://stackoverflow.com/a/12871547/3070485
但是,在阅读了解决方案之后,我在我的 IDE 中设置了我的编译器选项,即 Visual Studio 2019。
对于任何想要快速设置它并想要知道位置的人(因为这些东西会随着 IDE 版本的变化而变化,或者可能有人更熟悉另一个 IDE),这里就是它的去处。
配置属性
C/C++
预处理器 预
处理器定义
_WIN32_WINNT=0x0502
注意:#define _WIN32_WINNT
必须出现在任何头文件之前,包括“stdafx.h”。
如果使用 MFC:我的首选答案是包含 windows.h。但如果您使用的是 MFC,则不能这样做*。为了避免在您的项目中定义 WINVER,您可以在 afx.h 之前包含 sdkddkver.h。
#include <sdkddkver.h>
#include <afx.h>
sdkddkver 系统标头设置了 WINVER 和 _WIN32_WINNT,因此您无需将其添加到您的项目中。这与 windows.h 相同,用于从系统标头对 windows SDK/DDK 进行版本控制。
*如果你在 afx.h 之前包含 windows.h,你会得到:#error: WINDOWS.H already included. MFC apps must not #include <Windows.h>
#define _WIN32_WINNT
并且#define WINVER
可以出现在标头中,只要它们出现在包含SDKDDKVer.h
或来自 Windows SDK(特别是Windows.h
)的任何标头之前。Visual Studio VC++ 项目通常提供一个targetver.h
标头,您可以在其中包含WinSDKVer.h
、定义和_WIN32_WINNT
,然后包含。该文件中的评论说:NTDDI_VERSION
WINVER
SDKDDKVer.h
// If you wish to build your application for a previous Windows platform, include `WinSDKVer.h`
// and set the _WIN32_WINNT macro to the platform you wish to support before including `SDKDDKVer.h`.
Microsoft 文章更新 WINVER 和 _WIN32_WINNT 不遗余力地指导您定义_WIN32_WINNT
和WINVER
输入targetver.h
(尽管它提到这些也可以使用命令行参数定义)。
注意:targetver.h
被包含在 Visual Studio 生成的某些资源文件中,因此这是如上所述.rc
填写文件内容的另一个原因 。targetver.h
注意:在项目的构建配置中定义和_WIN32_WINNT
使用命令行参数或预处理器指令也可以工作,但两者都没有考虑包含和.NTDDI_VERSION
WINVER
WinSDKVer.h
SDKDDKVer.h
注意:在使用 Windows 8.1 SDK(或更新版本)时,您可能还需要根据您需要的特定 Windows 平台(服务器、桌面、手机、商店等)进行定义WINAPI_FAMILY
。targetver.h
详情请参阅winapifamily.h
。
注意:在较新的 Windows SDK 版本中,值NTDDI_VERSION
和WINVER
可以_WIN32_IE
根据您为 定义的值自动设置_WIN32_WINNT
。但是,您可能希望NTDDI_VERSION
在包含SDKDDKVer.h
.