【问题标题】:How to implement precompiled headers into your project如何在项目中实现预编译头文件
【发布时间】:2010-12-05 20:11:44
【问题描述】:

我了解预编译标头背后的目的和原因。但是,在实施时有什么规则呢?根据我的理解,它是这样的:

  1. 将您的项目设置为使用带有 YU 指令的预编译头文件。
  2. 创建您的 stdafx.h 文件并将其设置为您的预编译头文件。
  3. 将其作为每个 .h 文件中的顶部包含语句包含在内。

这样对吗?您是否应该将其排除在预编译头文件中包含的文件中?目前,按照我的直觉,我得到以下编译错误:

错误 C2857:“#include”语句 用 /Ycstdafx.h 指定 找不到命令行选项 源文件

命令行选项如下:

/Od /I “../外部/PlatformSDK/包含”/I ".." /I "../External/atlmfc/Include" /D "_D​​EBUG" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Yc"stdafx.h" /Fp"....\输出\LudoCore\Debug\LudoCore.pch" /Fo"....\输出\LudoCore\Debug\" /Fd"....\输出\LudoCore\Debug\vc80.pdb" /W4 /WX /nologo /c /ZI /TP /wd4201 /errorReport:提示

【问题讨论】:

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


    【解决方案1】:

    “stdafx”只是一个约定。这绝不是强制性的。在多项目解决方案中,我为不同的部分使用了具有多个预编译头文件的其他设置。例如。让您的 UI 项目共享一个 PCH 并为您的数据库项目共享另一个 PCH 可能会很有用。

    相关组件是列出可预编译头文件的 Xh 文件、仅包含 Xh(并且本身不添加任何代码)的 X.cpp 文件,以及使用编译器编译 X.cpp(以及 Xh)创建的 X.pch 文件选项/Yc

    当您现在使用 /Yu"X.pch" 编译 Y.cpp 文件时,编译器会读取并丢弃直到 #include "X.h" 的所有内容。此时,它将其内部状态替换为存储在 X.pch 中的状态,输入流除外(仍然是 Y.cpp,文件指针设置为#include "X.h" 之后的下一行)。

    【讨论】:

      【解决方案2】:

      您的 stdafx.cpp 应包含 stdafx.h 并使用 /Yc"stdafx.h" 构建。

      您的其他 *.cpp 应包含 stdafx.h 并使用 /Yu"stdafx.h" 构建。

      注意编译器选项中使用的双引号字符!

      这是用于创建预编译头文件的 stdafx.cpp 的 Visual Studio 设置屏幕截图:

      以下是相应的命令行选项(它们是只读的,但反映了在其他页面上指定的设置;请注意,IDE 在编译器选项中在文件名周围插入双引号字符):

      这是我的 stdafx.cpp 文件中的内容:

      // stdafx.cpp : source file that includes just the standard includes
      // CallWinsock.pch will be the pre-compiled header
      // stdafx.obj will contain the pre-compiled type information
      
      #include "stdafx.h"
      
      // TODO: reference any additional headers you need in STDAFX.H
      // and not in this file
      

      【讨论】:

      • 你是说这只能在命令行构建吗?在 Visual Studio 中,我不确定如何立即创建具有特定属性的东西。它似乎总是只是“添加 -> 新项目 -> 标题”等
      • 右键单击 cpp 文件并在上下文菜单中选择“属性”。在 C++ 配置属性页面中,有一个用于“预编译头文件”,用于指定此 CPP 文件创建或使用预编译头文件。
      • 感谢您的更新。我已经完成如上所示,仍然没有骰子。这是与您的上述相关的命令行选项: /Od /I "../External/PlatformSDK/Include" /I ".." /I "../External/atlmfc/Include" /D "_D​​EBUG" / D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Yc"stdafx.h" /Fp"..\..\Output\LudoCore\Debug\LudoCore.pch" /Fo"..\. .\Output\LudoCore\Debug\\" /Fd"..\..\Output\LudoCore\Debug\vc80.pdb" /W4 /WX /nologo /c /ZI /TP /wd4201 /errorReport:prompt
      • 您的 stdafx.cpp 的内容是什么(通过编辑并将其添加到您的原始问题中来显示)?你的 stdafx.h 在哪个目录下?
      • 如果它有内容我会把它添加到问题中,但它是空的,除了现在包含相应的头文件。
      【解决方案3】:

      Visual Studio 不仅可以按项目存储预编译的标头属性,还可以按源文件存储。

      默认情况下,所有属性都设置为“从父对象或项目默认值继承”,这仅显示该属性的父对象的值,但一旦在子级别(在本例中为 .cpp 文件)覆盖,该文件将忽略从父属性。

      你想要的配置是:

      1. 在项目级别选择“所有配置”(项目属性,从调试/发布更改配置下拉菜单),将您的预编译标头设置为“使用”
      2. 选择一个 .cpp 文件作为标头的来源(据我所知,哪个无关紧要)
      3. 右键单击并转到属性,然后为预编译头选择“创建”
      4. 最后确保没有其他 .cpp 文件为预编译头属性设置值(您可以通过粗体文本判断)

      【讨论】:

      • 修正了一个错字:“per-compiled”固定为“pre-compiled”。
      【解决方案4】:

      #include "stdafx.h" 应该是每个 cpp 文件的第一行。它不应该在 .h 文件中使用。除此之外,你是对的。

      【讨论】:

      • 我认为他的问题是指定 /Ycstdafx.h 而不是 /Yc"stdafx.h"。
      猜你喜欢
      • 2020-05-17
      • 2011-07-06
      • 2022-09-26
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多