从“ stdafx.h”更改为“ pch.h”

时间:2018-11-02 16:23:36

标签: c++ visual-studio precompiled-headers pch stdafx.h

我克隆了一个包含3个项目的repo c ++解决方案,一个控制台应用程序.exe,一个dll项目.dll和一个单元测试.dll。我不确定使用哪个版本的VS或编译器。

在我的机器上构建解决方案会出错

  

寻找预编译的标头时出现意外的文件结尾。你伪造了吗   t将'#include“ pch.h”'添加到您的来源中?

我在每个项目中根据另一种解决方案分别创建了pch.hpch.cpp

将每个项目的properties->c/c++->precompiled headers更改为

  • precompiled header = Create (/Yc)
  • precompiled header file = pch.h
  • precompiled header output file = $(IntDir)$(TargetName).pch

清除解决方案并删除Debug文件夹中的所有内容

现在构建解决方案引发

  

严重错误C1010:查找预编译的标头时,文件意外结束。你伪造了吗   要将'#include“ stdafx.h”'添加到您的来源中?

  • 这也是Azure管道显示的错误。因此,为了接近管道的构建过程,我使用VS命令行中的msbuild.exe。对我来说,怪异的部分是VC ++右键单击解决方案并进行构建,没有显示任何错误并进行了构建项目,此后msbuild.exe也会重新生成而没有错误。但是从Debug文件夹中删除所有内容并重试msbuild.exe再次显示这些错误!

我应如何强制解决方案中的所有项目使用stdafx.hpch.h

2 个答案:

答案 0 :(得分:0)

预编译头文件是加快构建过程的一项功能,因此,如果您在构建时遇到麻烦,可以始终关闭预编译头文件(在整个项目的项目设置中选择“不使用预编译头文件”),然后构建应该可以工作。

如果要使用预编译的头文件构建项目,则应仅对一个仅包含预编译头文件的include语句的源文件(pch.cpp或stdafx.cpp)启用“创建”选项。所有其他源文件都应选择“使用”预编译头。此外,它们还必须具有正确的#include语句作为预编译头文件的正确位置,作为文件中的第一条非注释行。

这个想法是,编译器在处理带有'create'选项集的文件中的预编译头文件#include语句时,会对其内部状态进行转储。 然后,当打开“使用”选项时,在文件中看到相应的包含文件时,它将加载该转储。加载转储的速度可能比例如通过Windows.h解析。因此,应将任何常用的大型头文件#include语句放入pch.h或stdafx.h。

如果.cpp文件具有“使用”选项,但是未找到带有在“预编译头文件”选项中设置的文件名的#include语句,则会产生错误消息。

答案 1 :(得分:0)

项目配置属性-> C / C ++->高级-> 强制包含文件中有一个选项。对于所有平台下的所有配置,请在此处输入新名称pch.h。这将迫使编译器在每个编译单元中自动#include "pch.h"

在这里停一会儿。对于所有配置和所有平台,或者您正在构建的一个 。在这里进行三重检查,不能多说。另外,请检查您是否正在编辑整个项目的设置,而不是单个文件。

这很有用,因为#include "pch.h"必须按字面意思是每个编译单元中的第一个include。如果foo.cpp#include "foo.h"不会有利于第一行中的#include "pch.h"。没用文件foo.cpp必须自己完成#include "pch.h"#include "foo.h"才能完成。

或者,如果您已经将stdafx.h重命名为其他地方的其他内容,并且不知道错误<{1>}来自 Force Include File 的位置,那么检查该地方!