winnt.h 导致更新后出现问题

Posted

技术标签:

【中文标题】winnt.h 导致更新后出现问题【英文标题】:winnt.h causes issues post-update 【发布时间】:2014-03-27 02:52:26 【问题描述】:

编辑:

我放弃了使 SDK 正常工作,而是使用 MinGW 提供的 Windows 标头。至于 SDL 的问题,我只是注释掉了一些关于 Windows RT 的内容,就我而言,这可能没问题,因为我从不打算为移动设备编译。


我最近去抓取 Windows SDK 8.1 来替换 7.1,我不得不这样做,因为我去抓取 SDL 2.0.3 来替换 2.0.1,而 SDL 现在依赖于一个文件“winapifamily.h”,它是仅在 8.x SDK 而不是 7.x 中,这没什么大不了的……直到我转到我一直在从事的网络项目。我的代码不是问题,而是我的环境。现在设置了较新的 SDK,winnt.h 会导致大量问题。

C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|940|error: #error Must define a target architecture.| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|1311|error: 'EXCEPTION_DISPOSITION' does not name a type| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|1320|error: 'EXCEPTION_ROUTINE' does not name a type| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'BYTE ReadUCharAcquire(const volatile BYTE*)':| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8287|error: 'ReadAcquire8' was not declared in this scope| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'BYTE ReadUCharNoFence(const volatile BYTE*)':| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8298|error: 'ReadNoFence8' was not declared in this scope| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'void WriteUCharRelease(volatile BYTE*, BYTE)':| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8321|error: 'WriteRelease8' was not declared in this scope| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'void WriteUCharNoFence(volatile BYTE*, BYTE)':| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8334|error: 'WriteNoFence8' was not declared in this scope| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'WORD ReadUShortAcquire(const volatile WORD*)':| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8359|error: 'ReadAcquire16' was not declared in this scope| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'WORD ReadUShortNoFence(const volatile WORD*)':| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8370|error: 'ReadNoFence16' was not declared in this scope| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'void WriteUShortRelease(volatile WORD*, WORD)':| C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8393|error: 'WriteRelease16' was not declared in this scope| ||More errors follow but not being shown.| ||Edit the max errors limit in compiler options...| ||=== Build finished: 10 errors, 0 warnings (0 minutes, 39 seconds) ===|

我已经篡改了我的环境大约八个小时,甚至重新安装了 MinGW,认为它可能有一些过时的头文件或库或其他东西。这可能是我错过的非常简单的事情,如果有人知道可能导致这些问题的原因,我将不胜感激。

Microsoft 是否只编写不可靠的标头? SDK 是否仅适用于 Visual Studio 编译器,如果是,为什么在许多 Windows 标头甚至 winnt.h 中都有很多字母“GNU”和“GCC”的实例?

【问题讨论】:

这是***.com/questions/2022112/…的副本吗? 我希望。我尝试添加 -mwindows 并没有帮助。不过,我以前不需要它……只有新的 SDK 有这个问题。 我建议然后偷看 winnt.h 和 winapifamily.h 看看他们期待什么#defines - 它可能最终很简单,只需要你添加一个“-D”到您的makefile中的CFLAGS变量... 我担心如果我篡改文件会破坏某些东西,或者如果我定义了一些会使错误消失的东西,那么它会产生不一致,因为我从来不需要对7.x 开发工具包。所以也许是的,这是我需要添加的一些标志,但我不使用生成文件。这个 -D 你在说什么? 您不需要更改这些文件中的任何内容,只需检查其中的#ifdef 类型 - 例如,如果您查看 winnt.h 中的第 940 行,您会看到它位于#if...#else...#endif 块内。然后,您将能够看到它期望看到的标志。当你知道它们是什么时,你可以像gcc -D<flag> myprog myprog.c一样调用 gcc 【参考方案1】:

我知道这有点太晚了,但对于那些仍然有同样问题的人来说。 问题确实源于环境。特别是,从 include 目录指向 2 个不同版本的 winnt.h 并且在你的情况下,可能还有 winsock2.h 你说这是您正在处理的网络应用程序。 背景:您的项目中有 2 个 include 文件列表。一个来自您的项目设置,第二个来自编译器设置中定义的全局包含,按此顺序强>. 也许,在您之前的配置中,winnt.h、winsock2.h 等是从指向 Mingw 提供的文件的 global 设置中获取的,但现在可以肯定,它们位于 SDK 的包含路径中(我也遇到过)。 你的问题是优先之一。 SDK 中的“windows”文件不适用于 Mingw,以至于 Mingw 包含这些文件,但已修改。 您需要做的是,放在列表顶部,在您的项目设置的 include 目录 中,您在指向 Mingw 提供的文件的全局设置中找到相同的目录,在这样的这些 windows 文件取自 Mingw 而不是 SDK 中的文件。 希望这会有所帮助。

【讨论】:

以上是关于winnt.h 导致更新后出现问题的主要内容,如果未能解决你的问题,请参考以下文章

jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法

window系统更新导致很多服务出错

MacOS 10.14.6 更新后 Tkinter 导致计算机崩溃

更新exchange 2013 cu21补丁后出现的问题解决

更新到 iOS 6.1 后出现 ARC Retain Cycle

更新了显卡驱动后为啥电脑变卡了?