编译错误: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)
这与我在网上找到的一些问题类似,即使不是同一个问题,但仍然找不到任何合适的解决方案:
- 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(德语 link)
- https://www.spieleprogrammierer.de/11-hilfe-zum-buch-3d-spieleprogrammierung-von-david-scherfgen/3719-mal-wieder-fehler/(德语 link)
- 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 时遇到的问题 - 尽管那时一切仍然正常 - 所以我能想到的最好的,它可能是类似的问题,因为 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.
中给出的解决方法
我不知道它在什么时候停止工作,因为上个月左右我一直在使用 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)
这与我在网上找到的一些问题类似,即使不是同一个问题,但仍然找不到任何合适的解决方案:
- 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(德语 link)
- https://www.spieleprogrammierer.de/11-hilfe-zum-buch-3d-spieleprogrammierung-von-david-scherfgen/3719-mal-wieder-fehler/(德语 link)
- 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 时遇到的问题 - 尽管那时一切仍然正常 - 所以我能想到的最好的,它可能是类似的问题,因为 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.
中给出的解决方法