编译错误:Windows API headers.. 坏了?

Compilation errors: Windows API headers.... broken?

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

我遇到的第一个也是最常见的(许多)问题来自 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

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

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

我目前有 MS Visual Studio 2010 Express, MS Visual Studio 2013 Express, Code::Blocks(使用 MinGW)和 DevC++ 安装。这期间唯一改变的是我试用了VS 2010 Ultimate(试用期满不久后卸载)来尝试一些扩展,但同时一切都很好,我不知道为什么它突然停止工作.

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

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

我真的不知道该怎么办!


编辑: 空项目和简单的 "Hello World!" 程序都能正确编译 & 运行。然而,一旦我#include <windows.h>,编译问题就出现了。

已解决。

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

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


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

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

解决方法参考this question.

中给出的解决方法