编译错误:Windows API 标头....坏了?

Posted

技术标签:

【中文标题】编译错误:Windows API 标头....坏了?【英文标题】:Compilation errors: Windows API headers.... broken? 【发布时间】:2015-02-05 05:32:19 【问题描述】:

我不知道它在什么时候停止工作,因为我上个月左右一直在使用 Code::Blocks 和 MinGW。尽管如此,由于我再次打开 Visual Studio,几乎我所有的 MSVC 项目(以及新项目)都已完全停止工作,并且每次尝试构建它们时,我都会在 Windows API 标头中遇到数百个错误。

我遇到的第一个也是最常见的(许多列表)问题来自 windows.h,然后包含以下内容:

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winnt.h(3606): warning C4103: 'c:\program files (x86)\microsoft visual studio 10.0\vc\include\winnt.h' : alignment changed after including header, may be due to missing #pragma pack(pop)
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winnt.h(3908): warning C4103: 'c:\program files (x86)\microsoft visual studio 10.0\vc\include\winnt.h' : alignment changed after including header, may be due to missing #pragma pack(pop)
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winnt.h(4006): warning C4068: unknown pragma
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winnt.h(4012): warning C4068: unknown pragma
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winnt.h(4019): warning C4068: unknown pragma
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1482): error C2144: syntax error : 'void' should be preceded by ';'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1482): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1483): error C2144: syntax error : 'void' should be preceded by ';'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1483): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1483): error C2086: 'int DECLSPEC_NORETURN' : redefinition
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1482) : see declaration of 'DECLSPEC_NORETURN'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1543): error C2144: syntax error : 'void' should be preceded by ';'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1543): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1543): error C2086: 'int DECLSPEC_NORETURN' : redefinition
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1482) : see declaration of 'DECLSPEC_NORETURN'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\rpcdce.h(369): error C2144: syntax error : 'void' should be preceded by ';'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\rpcdce.h(369): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\rpcdce.h(369): error C2086: 'int DECLSPEC_NORETURN' : redefinition
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\winbase.h(1482) : see declaration of 'DECLSPEC_NORETURN'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\rpcdcep.h(89): error C3646: 'I_RpcAllocate' : unknown override specifier
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\rpcdcep.h(89): error C2091: function returns function
...

等等。等(完整编译输出here)

这与我在网上找到的一些问题相似,即使不是相同的问题,但仍然找不到任何合适的解决方案:

http://www.jenkinssoftware.com/forum/index.php?topic=4877.0;wap2 http://ogre3d.org/forums/viewtopic.php?f=2&t=26302 https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c97c9ed-c6a0-4f35-8bbf-33203e227f68/setting-up-windowsh-not-found?forum=vcgeneral https://social.msdn.microsoft.com/Forums/vstudio/en-US/6cc0cfe6-2c59-4925-bdda-2920a0f7245b/big-time-problems-with-headers?forum=vclanguage https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/06ca7ef8-6567-4968-99d3-d989cdcb1b8c/help-errors?forum=vcgeneral http://irrlicht.sourceforge.net/forum/viewtopic.php?f=1&t=17147 http://forums.codeblocks.org/index.php?topic=4508.0 https://www.c-plusplus.net/forum/167678-full(德语链接) https://www.spieleprogrammierer.de/11-hilfe-zum-buch-3d-spieleprogrammierung-von-david-scherfgen/3719-mal-wieder-fehler/(德语链接) https://zakimirza.wordpress.com/2007/03/04/setting-up-sdl-opengl-in-visual-studio/(在文章下方的评论中)

这也让我想起了我在(愚蠢地)尝试compile from MSVC using the MinGW inclusions/libraries some time ago 时遇到的问题——尽管那时一切都还在正常工作——所以我能想到的最好的可能是一个类似的问题,如由于某种原因,标头变得不兼容。因此,我想,也许我在不知不觉中安装了 Win64 版本?

我目前有 MS Visual Studio 2010 ExpressMS Visual Studio 2013 ExpressCode::Blocks(使用 MinGW)和 DevC++ 已安装。在此期间唯一改变的是我尝试了 VS 2010 Ultimate(试用期结束后不久卸载)尝试了一些扩展,但同时一切正常,我不知道为什么它突然停止工作.

我尝试卸载并重新安装 MSVC、Windows SDK 和 DirectX SDK,但没有任何效果。环境变量看起来很好,但可能我没有正确检查。

所有项目都处于我保留它们的相同工作状态,环境为 Win32,所有包含路径与以前相同。

我真的不知道该怎么办!


编辑: 空项目和简单的“Hello World!”程序编译和运行正确。但是我一#include <windows.h>,编译问题就出现了。

【问题讨论】:

可能是您包含了一些 Windows API 标头而没有首先包含 <windows.h> 创建并构建一个新的空项目(Visual Studio 2010 Start Page -> New Project)来测试是否实际安装和配置了 Visual Studio 本身。也许您的 windows.h 和其他包含文件的实际位置以某种方式发生了更改,并且在您的所有旧项目中不再正确。在我的 Visual Studio 2010 Pro 设置中,我的 %programfiles(x86)%\Microsoft Visual Studio 10.0\VC\include 是空的,而 windows.h 实际上位于 %programfiles(x86)%\Microsoft SDKs\Windows\v7.0A\Include 中。也许您的 MS SDK 7 不知何故被卸载了? 正如我所说,这些项目都处于我留下的相同状态,所以标题都正确包含。此外,Windows SDK 已正确安装(并重新安装)并且 windows.h 似乎位于这两个文件夹中,但是 Visual Studio 一个来自 26/03/2011 (2.98 KB) 和 Win。 SDK 1 来自 30/09/2009 (6.02 KB)。那些这意味着什么? 空项目和简单的“Hello World!”程序编译和运行正确。但是,只要我包含 ,就会出现编译问题。 【参考方案1】:

已解决。

问题是,MinGW 包含以某种方式最终在 MSVC 目录中,使编译器改为使用这些。由于它们是 Unix (POSIX) 头文件,MSVC 编译器无法编译它们,而是抛出异常长的错误列表。为了解决这个问题,我不得不从包含文件夹中删除所有非 MSVC 标头。简单的卸载和重新安装不起作用的原因是因为 MS 卸载程序是特定于文件的,并将所有非原始文件留在目录中。事实上,Visual Studio 在包含文件夹中没有任何 Windows API 标头,应该使用随 Windows SDK 提供的标头。

所以,由于我见过很多人遇到这个问题但没有解决方案,我将在这里留下最简单的答案: 为了清理文件夹中不需要的任何内容,您必须先卸载所有内容,然后手动删除这些文件夹,最后重新安装所有内容。如果您安装了许多额外的库(实际上,我已经安装了一些)并且只想删除特定的错误标头,而留下其余的,那么可能会有更微妙的解决方案会更好,但我真的不知道如何。如果有人知道这样做的方法,比如检查与 MSVC 兼容的头文件和库的工具,请告诉我!


编辑: 此外,可能会发生(至少在我的情况下发生)VS SP1 在此过程中也被损坏,从而导致编译器错误,例如:

LINK:致命错误 LNK1123:转换为 COFF 时失败:文件无效或损坏

要解决这个问题,请参考this question中给出的解决方案。

【讨论】:

以上是关于编译错误:Windows API 标头....坏了?的主要内容,如果未能解决你的问题,请参考以下文章

C++ WinSDK 头文件编译错误

预编译标头 IntelliSense 错误

在 ac-docker win10 中编译时出现构建错误,要求重建已编译的标头,因为自预编译标头以来文件已被修改

如何在Linux上使用Windows标头构建Visual C ++应用程序?

为什么在调用azure数据湖gen2的put文件api时出现丢失的头错误?

C ++编译的标头收到大量错误[重复]