23
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)

在我的编译过程中不断弹出这个错误。它似乎不影响编译,但我应该如何摆脱它?我是否会因为忽略它而冒任何风险?

4

6 回答 6

22

将其设置为您希望程序运行的最旧的 Windows 操作系统。此 MSDN 文章Using the Windows Headers中给出了可能的值。

#define您可以通过使用每个源文件中的语句或通过指定/DVisual 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
于 2012-10-13T08:54:24.403 回答
19

它是通过 WinSDKVer.h 为您定义的。因此,只需在源代码的顶部明确定义它(例如在 stdafx.h 的开头),您就会摆脱警告。

将其定义为相同的值(与_WIN32_WINNT_MAXVERWinSDKVer.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
于 2012-10-13T08:53:18.303 回答
4

在 VS2019 中求解

解决这个问题的方法和可能使用的值的链接可以在我用来解决问题的 user93353 的超级答案中找到。

https://stackoverflow.com/a/12871547/3070485

但是,在阅读了解决方案之后,我在我的 IDE 中设置了我的编译器选项,即 Visual Studio 2019。

对于任何想要快速设置它并想要知道位置的人(因为这些东西会随着 IDE 版本的变化而变化,或者可能有人更熟悉另一个 IDE),这里就是它的去处。

在此处输入图像描述

配置属性
C/C++
预处理器 预
处理器定义
_WIN32_WINNT=0x0502

于 2019-06-11T10:54:51.637 回答
2

注意:#define _WIN32_WINNT必须出现任何头文件之前,包括“stdafx.h”。

于 2013-07-24T13:50:34.470 回答
1

如果使用 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>

于 2020-04-15T22:35:28.860 回答
0

#define _WIN32_WINNT并且#define WINVER 可以出现在标头中,只要它们出现在包含SDKDDKVer.h或来自 Windows SDK(特别是Windows.h)的任何标头之前。Visual Studio VC++ 项目通常提供一个targetver.h标头,您可以在其中包含WinSDKVer.h、定义和_WIN32_WINNT,然后包含。该文件中的评论说:NTDDI_VERSIONWINVERSDKDDKVer.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_WINNTWINVER输入targetver.h(尽管它提到这些也可以使用命令行参数定义)。

注意:targetver.h被包含在 Visual Studio 生成的某些资源文件中,因此这是如上所述.rc填写文件内容的另一个原因 。targetver.h

注意:在项目的构建配置中定义和_WIN32_WINNT使用命令行参数或预处理器指令也可以工作,但两者都没有考虑包含和.NTDDI_VERSIONWINVERWinSDKVer.hSDKDDKVer.h

注意:在使用 Windows 8.1 SDK(或更新版本)时,您可能还需要根据您需要的特定 Windows 平台(服务器、桌面、手机、商店等)进行定义WINAPI_FAMILYtargetver.h详情请参阅winapifamily.h

注意:在较新的 Windows SDK 版本中,值NTDDI_VERSIONWINVER可以_WIN32_IE根据您为 定义的值自动设置_WIN32_WINNT。但是,您可能希望NTDDI_VERSION在包含SDKDDKVer.h.

于 2020-01-13T19:38:48.957 回答