【问题标题】:How to fix .pch file missing on build?如何修复构建时丢失的 .pch 文件?
【发布时间】:2018-08-09 11:06:28
【问题描述】:

当我在 Visual Studio 中构建我的 c++ 解决方案时,它抱怨缺少 xxxxx.pch 文件。是否有我缺少的设置来获取预编译的标头?

这是完整性的确切错误:

Error   1   fatal error C1083: Cannot open precompiled header file: 'Debug\xxxxx.pch': No such file or directory

【问题讨论】:

  • 您必须提供更多信息。你到底得到了什么错误?您的项目目前是如何配置的?
  • 只是一个简单的重建就解决了我的问题。

标签: c++ visual-studio precompiled-headers pch


【解决方案1】:

Precompiled Header (pch) 的使用分为两步。

在第一步中,您编译一个存根文件(在 VS200x 中,它通常称为stdafx.cpp。较新的版本使用pch.cpp。)。这个存根文件间接地只包含你想要预编译的头文件。通常,一个小的标头(通常是stdafx.hpch.hpp)列出标准标头,例如<iostream><string>,然后将其包含在存根文件中。编译它会创建 .pch 文件。

在第 2 步中,您的实际源代码包含与第 1 步中的第一个标头相同的小标头。编译器在遇到这个特殊的头文件时,会改为读取相应的 .pch 文件。这意味着它不必每次都(重新)编译那些标准头文件。

在您的情况下,似乎第 1 步失败了。存根文件是否仍然存在?在你的情况下,那可能是xxxxx.cpp。它必须是使用/Yc:xxxxx.pch 编译的文件,因为这是编译器标志,表明它是PCH 过程的第1 步。如果xxxxx.cpp 存在,并且是这样一个存根文件,那么它可能缺少其/Yc: 编译器选项。

【讨论】:

  • 那么它可能缺少它的 /Yc: 编译器选项。顺便说一下,该选项位于项目属性页/配置属性/C-C++/预编译头文件中
【解决方案2】:
  1. 右键单击项目并选择属性菜单项
  2. 转到 C/C++ -> 预编译头文件
  3. 选择不使用预编译头文件

【讨论】:

  • 这对我有用。我删除了“stdafx.cpp”,然后当我重新添加它时,这个错误不会消失,直到我关闭预编译头文件。无论如何,这个项目很小,所以它对速度的影响不大。
  • 4.选择Create (/Yc)(恢复后再次使用)
【解决方案3】:

注意:更高版本的 IDE 可能在相关文件的默认名称中使用“pch”而不是“stdafx”。在下面的说明中,可能需要用 pch 替换 stdafx。我道歉。这不是我的错。

  1. 在解决方案资源管理器中右键单击您的项目。
  2. 点击下拉菜单底部的属性。
  3. 在属性页的左上角, 从下拉菜单中选择所有配置。
  4. 打开 C/C++ 树并选择 Precompiled Headers
  5. 预编译头文件:选择使用 (/Yu)
  6. 填写预编译头文件字段。标准是 stdafx.h
  7. 点击确定

  8. 如果您的头文件中没有 stdafx.h,请将其放在那里。编辑 它#include所有你想要预编译的头文件。

  9. 将名为 stdafx.cpp 的文件放入您的项目中。把#include“stdafx.h” 在它的顶部,仅此而已。
  10. 在解决方案资源管理器中右键单击 stdafx.cpp。选择属性 和第 4 步中的所有配置...
  11. ... 但这次选择 Precompiled Header Create (/Yc). 这只会 绑定到一个文件 stdafx.cpp。
  12. 将#include "stdafx.h" 放在所有源文件的最顶部。

幸运 13。交叉手指点击 Build。

【讨论】:

  • 我不知道 stdafx.cpp 应该有不同的设置。很好的答案。
  • 这应该是公认的答案,因为另一个缺少第 10 步和第 11 步。谢谢!
  • 这是一个比我更基本的答案。步骤 1-7 是使 PCH 正常工作所必需的,但问题中的错误消息表明这些步骤已经完成。 OTOH,它假定单个 stdafx.pch 文件,而问题中的 xxxxx.pch 暗示了一个更复杂的问题(多 PCH 设置)。
  • 这个答案真的拯救了一天。谢谢。
  • 谢谢您,先生!回到我的 C/C++r 根来做一个新项目,我觉得有点像个垃圾
【解决方案4】:

修复:

  1. 确保您的项目中有 xxxxx.cpp

  2. 使用 /Yc 标志编译 xxxxx.cpp创建预编译头文件)
    (右击 xxxxx.cpp -> 属性 -> 预编译头文件 -> create

  3. 使用 /Yu 标志编译所有其他文件使用预编译头文件)
    (右键项目->属性->预编译头文件->使用

【讨论】:

  • 这解决了我的问题。非常感谢!
【解决方案5】:

是的,它可以像其他人指出的那样使用 /Yc 选项消除,但很可能您不需要触摸它来修复它。为什么在不更改任何设置的情况下首先出现此错误?您可能已经“清理”了项目,然后尝试编译单个 cpp 文件。在这种情况下,您会收到此错误,因为现在缺少预编译器标头。只需构建整个项目(即使不成功)而不是构建任何单个 cpp 文件,您将不会收到此错误。

【讨论】:

    【解决方案6】:

    尝试构建 > 清洁解决方案,然后构建 > 构建解决方案。 This 为我工作。

    【讨论】:

      【解决方案7】:

      如果一切正常,但出现此错误,则需要检查 ****.vcxproj 文件中的下一部分:

      <ClCompile Include="stdafx.cpp">
        <PrecompiledHeader Condition=
      

      在我的情况下,配置名称不正确:只有第一个单词。

      【讨论】:

        【解决方案8】:

        我知道这个话题很老了,但我最近在 VS2015 中处理这个问题,帮助删除构建文件夹并重新构建它。这可能是由于在构建时试图关闭程序或程序停止/冻结 VS 而发生的。

        【讨论】:

        • 是的,但最初的问题与 VS2008 相关,而不是 VS2015。您确定这会解决 OP 的问题吗?
        • 不管 VS 是什么版本,这个问题在不同的构建中仍然存在。只要尝试一下,看看它是否适用于您要处理的任何人。
        【解决方案9】:

        我正在寻找有同样问题的iOS PCH文件,如果你也像我一样来到这里,我找到的解决方案是清除派生数据;关闭 Simulator(s),转到 xCode 首选项 -> 位置 -> 转到派生数据文件路径,关闭 xCode,删除派生数据文件夹中的文件,重新启动并欢呼:)

        【讨论】:

          【解决方案10】:

          如果您在服务器构建 (AppCenter) 上发生这种情况并且您使用 CocoaPods 确保您的 Podfile 已签入。

          AppCenter 仅在找到 Pofile 且未在文件中找到 PODS 文件夹时才运行“pod install”命令。

          我已签入该文件夹,但由于 git 自动忽略 .pch 文件(检查您的 .gitignore 以验证这一点),我的 .pch 没有被签入。

          我通过强制 .pch 文件检查来解决我的问题,但删除 PODS 文件夹也应该有效,因为在这种情况下 Appcenter 将运行 pod install 命令。

          希望这对某人有所帮助。

          【讨论】:

            【解决方案11】:

            VS 搞砸了(我的是 2019 年;()。 继续并像其他人指出的那样选择“不使用预编译头文件”,然后使用任何文本编辑器打开项目文件(vcxproj),并在两个地方删除概述的两个条目。享受清理烂摊子的乐趣! 事实上,你在下面看到的 vcxproj 文件中的“pch.h”条目,你会在 VS 属性的界面中找到它。

            【讨论】:

              【解决方案12】:

              我设法为自己创建了这个问题,因为我想使用来自不同目录的 pch.h 和 pch.cpp 文件。所以,我从我的项目中删除了这两个文件,然后将它们添加为其他地方的现有文件。大错误,预编译的头文件已经找不到了。

              我无法从 Visual Studio 2019 UI 中找到解决问题的方法。您必须编辑项目文件并确保如下所示:

               <ClCompile Include="pch.cpp">
                    <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
                    <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
                    <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
                    <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
                </ClCompile>
              

              【讨论】:

                猜你喜欢
                • 2011-08-31
                • 2013-03-05
                • 2019-02-07
                • 2012-04-27
                • 2012-10-03
                • 2010-10-31
                • 2016-03-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多