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

12
我有一个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.

就我所知,这与预编译头文件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.

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

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

2个回答

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

2
如果你确实想要使用标准库模块,那你需要做什么呢? - Erik Bongers
2
更新:显然在msvc中,标准库模块替换了预编译头文件!这是很合理的。然而,如果你的代码需要与其他编译器一起使用,最好不要过快地替换这些PCHs。 - Erik Bongers
3
您也可以通过将“C++语言标准”设置为“ISO C++20标准 (/std:c++20)”或其他非最新标准来修复它。 - manylegged

1

我知道原问题中没有提到CMake,但当我搜索这个问题时,它是最早的结果之一,所以我将在这里给出CMake项目的解决方案,或许对其他人有用。

创建一个以下内容的属性表(*.props文件):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemDefinitionGroup>
        <ClCompile>
        <BuildStlModules>false</BuildStlModules>
        </ClCompile>
    </ItemDefinitionGroup>
</Project>

将属性表添加到目标中,使用PCHs,例如:
SET_PROPERTY(TARGET target_name PROPERTY VS_USER_PROPS path_to_props_file.props)

这个单独的方法对我来说并没有解决问题。如果我要么从C++23回退到set(CMAKE_CXX_STANDARD 20)并保留预编译,要么保持C++23并禁用target_precompile_headers(MyTarget PRIVATE source/precomp.h),它就能正常工作。 - Dwayne Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接