1
votes

I clone a repo, c++ solution with 3 projects, a console application .exe a dll project .dll and a unit test .dll. I am not sure with what version of VS or compiler it was built or created.

building the solution on my machine was throwing erro

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

I created pch.h and pch.cpp according to another solution in every project.

changed the properties->c/c++->precompiled headers of every project to

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

cleared solution and deleted every thing in Debug folders

now building the solution throws

fatal error C1010: unexpected end of file while looking for precompiled header. Did you forge t to add '#include "stdafx.h"' to your source?

  • Also this was the Error Azure pipelines were showing. so to be close to build process of pipeline I use msbuild.exe from VS commandline. The weird part for me is that the VC++ right click on solution and build, does not show any error and build project, and after that msbuild.exe also rebuilds without error. But deleting everything from Debug folders and re-trying msbuild.exe shows these errors again!

How should I force all projects in a solution to use stdafx.h or pch.h

2

2 Answers

1
votes

The precompiled headers are a feature to speed up the build process, so if you have trouble building, you can always turn off the precompiled headers (select 'Not using precompiled headers' in the project settings for the whole project) and the build should work.

If you want to make the project build with precompiled headers, you should have the 'Create' option on for only one source file (pch.cpp or stdafx.cpp) that only contains the include statement for the precompiled header file. All the other source files should have the 'use' precompiled headers selection on. Also they must have the correct #include statement for your precompiled header as the 1st non-comment line in the file.

The idea is that the compiler makes a dump of its internal state when processing the precompiled header #include statement in the file with the 'create' option set. It then loads that dump when it sees the corresponding include in the files with the 'use' option turned on. Loading the dump can be much faster than e.g. parsing through windows.h. So yo should put any commonly used large header file #include statements in the pch.h or stdafx.h.

The error messages you got are produced if the .cpp file has the 'use' option on, but the #include statement with the file name set in the 'precompiled header file' option is not found.

0
votes

There is an option in project Configuration properties -> C/C++ -> Advanced -> Forced Include File. Put the new name pch.h here for all configurations under all platforms. This will force the compiler to automatically #include "pch.h" in each and every compilation unit.

Stop here for a moment. For all configurations and all platforms, or the one you're building. Triple-check here, can't say that more. Also, check that you're editing setting of the whole project, but not a single file.

This is useful, because the #include "pch.h" must literarily be the first include in every compilation unit. It won't help if foo.cpp does #include "foo.h" that in it's favor does #include "pch.h" in the first line. Ain't working. File foo.cpp must do #include "pch.h" on it's own, and only then #include "foo.h".

Alternatively if you already renamed stdafx.h into something else everywhere and can't understand where the error C1083: Cannot open include file: 'StdAfx.h': No such file or directory is coming from Forced Include File is the place to check!