【问题标题】:Issues with Sharing Precompiled Header共享预编译头文件的问题
【发布时间】:2021-03-15 16:55:01
【问题描述】:

我知道这已被问过一百次,但我似乎无法让我的项目正常工作。 我有两个项目,都是静态库(.lib)。一个项目是我的核心引擎项目,它有一个预编译的头文件,我的另一个项目是一个输入管理器项目,它使用我的核心引擎,所以我最初的问题是,如果我不使用预编译头文件设置我的输入管理器项目,所有核心引擎文件包含缺少包含的编译器错误。 所以我一直在尝试设置我的输入管理器以使用来自核心引擎项目的预编译头文件,我将介绍如何设置它。

我的核心引擎项目是按照您通常设置预编译头文件的方式设置的,并且一切正常。 关于核心引擎项目本身

我的 PrecompiledHeader.cpp 文件使用这些设置。

另一方面,我认为我的输入管理器给我带来了麻烦,我尝试了一大堆不同的设置,但我没有得到任何结果。这就是我的输入管理器项目的设置方式。

所以它指向核心引擎的 .pch 文件。 使用我在网上找到的一些答案,我还复制了 Core Engine 的 .pdb 和 .idb 文件,如下所示。

这有效,这两个 .pdb 和 .idb 文件正在被复制。 我还将 Core Engine 的文件夹添加到 Additional Include Directories 中,根据我在网上阅读的所有内容,我认为这就是我应该做的所有事情,但仍然无法让它工作。

我的输入管理器项目现在只有两个文件,InputManager.h 和 InputManager.cpp,我尝试在 InputManager.cpp 的顶部包含和不包含 PrecompiledHeader.h。无论我尝试什么,我都会从 Input Manager 项目中得到这个错误。

unexpected end of file while looking for precompiled header. Did you forget to add '#include "PrecompiledHeader.h"' to your source?

如果有人对如何进行这项工作甚至更好的解决方案有任何见解,我会全力以赴。

谢谢!

【问题讨论】:

  • 我认为您应该为每个项目使用不同的预编译头文件。还有你是怎么加入的?
  • 从我在线阅读的内容来看,跨项目共享预编译头文件是可行的,只是看起来很棘手。我也尝试将 PrecompiledHeader.cpp 和 PrecompiledHeader.h 添加到我的 Input Manager 项目中,并让它成为我的 Input Manager 项目自己的 .pch 但也没有运气。当我说我在 InputManager.cpp 的顶部包含 PrecompiledHeader.h 时,我只是在顶部添加了 #include "PrecompiledHeader.h"

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


【解决方案1】:

目前,还有另一种方式来实现共享预编译头文件,即构建一个SharedPCH。您可以参考Microsoft Blog 了解更多信息。这是文章。

当 ConsoleApplication 项目引用 SharedPCH 时,构建会自动链接 SharedPCH 的静态库,但也需要更改几个项目属性。

C/C++ 附加包含目录 (/I) 应包含共享的 stdafx.h 目录 C/C++ Precompiled Header Output File (/Fp) 应设置为共享 pch 文件(由 SharedPCH 项目产生) 如果您的项目是使用 /Zi 或 /ZI 编译的(请参阅最后关于这些开关的更多信息),使用共享 pch 的项目需要将共享 pch 项目生成的 .pdb 和 .idb 文件复制到它们的特定位置所以最终的 pdb 文件包含 pch 符号。 由于所有项目的这些属性都需要进行类似更改,因此我创建了 SharedPCH.props 和 CustomBuildStep.props 文件,并使用 Property Manager 工具窗口将它们导入到我的项目中。

SharedPch.props 有助于 #1 和 #2 并在所有项目中导入。 CustomBuildStep.props 有助于 #3 并被导入到消费 pch 项目,但不导入到生产项目。如果您的项目使用 /Z7,则不需要 CustomBuildStep.props。

在 SharedPch.props 中,我定义了共享 pch、pdb 和 idb 文件位置的属性:

调整了 C/C++ 的‘Additional Include Directories’和‘Precompiled Header Output File’属性:

在 CustomBuildStep.props 中,我定义了在 ClCompile 目标之前运行的自定义构建步骤,并复制共享的 pch .pdb 和 .idb 文件(如果它们比项目的 .pdb 和 .idb 文件更新)。请注意,我们在这里讨论的是编译器中间 pdb 文件,而不是链接器生成的最终文件。

如果项目中的所有文件都使用一个 pch,这就是我们需要做的,因为当 pch 更改时,所有其他文件也需要重新编译,所以在构建结束时我们将拥有完整的pdb 和 idb 文件。

如果您的项目使用多个 pch 或包含根本不使用 pch 的文件,则需要更改这些文件的 pdb 文件位置 (/Fd),以便共享 pch pdb 不会覆盖它.

我使用命令行属性编辑器来定义命令。每个“xcopy”命令都应该在自己的行中:

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多