Visual Studio 2022 版本 17.6 中的预编译标头错误

Fed*_*dor 12 compiler-errors precompiled-headers visual-c++ visual-studio-2022

我有一个 Visual Studio C++ 项目,最近将 Visual Studio 2022 从版本 17.5 更新到版本 17.6 后,编译从一开始就停止并出现错误:

1>------ Rebuild All started: Project: MRPch, Configuration: Debug x64 ------
1>Scanning sources for module dependencies...
1>std.compat.ixx
1>std.ixx
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\modules\std.compat.ixx : fatal  error C1083: Cannot open include file: 'MRPch.h': No such file or directory
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\modules\std.ixx : fatal  error C1083: Cannot open include file: 'MRPch.h': No such file or directory
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(486,5): warning MSB8074: Cannot read Module Dependencies file C:\Work\MeshInspector\source\TempOutput\MRPch\x64\Debug\std.ixx.module.json: Expecting element 'root' from namespace ''.. Encountered 'None'  with name '', namespace ''.  The build order might be incorrect.
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(486,5): warning MSB8074: Cannot read Module Dependencies file C:\Work\MeshInspector\source\TempOutput\MRPch\x64\Debug\std.compat.ixx.module.json: Expecting element 'root' from namespace ''.. Encountered 'None'  with name '', namespace ''.  The build order might be incorrect.
Run Code Online (Sandbox Code Playgroud)

据我所知,它与预编译头有某种关系MRPch.h,预编译头通过编译器选项强制包含在所有源文件中/FI"MRPch.h"

如果我删除强制包含,则错误将更改为

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\modules\std.ixx(147,1): fatal  error C1010: unexpected end of file while looking for precompiled header.
Run Code Online (Sandbox Code Playgroud)

我的项目中既没有std.compat.ixx也没有,但我发现该错误与命令行选项std.ixx有关,该选项启用了最新的语言功能。/std:c++latest

我查看了Visual Studio 2022 版本 17.6 发行说明,但没有看到任何与预编译头相关的内容。它们不再与最新的 C++ 标准兼容吗?

小智 15

要解决此问题,请更改此设置:项目属性 > C/C++ > 语言 > 构建 ISO C++23 标准库模块 > 否。

  • 您还可以通过将“C++ 语言标准”设置为“ISO C++20 标准 (/std:c++20)”或除最新版本之外的其他内容来修复此问题。 (3认同)
  • 不过...如果您*确实*想使用std lib 模块,您需要做什么? (2认同)
  • 更新:显然在 msvc 中,std lib 模块**替换**预编译头!这是有道理的。但是,如果您的代码需要与其他编译器一起工作,那么最好不要太快替换这些 PCH。 (2认同)