使用vc的人经常遇到fatal error C1083: Cannot open precompiled header file: 'Debug/xxx.pch': No such file or directory, 怎么rebuild all都不行,这是删除了一些中间文件的结果。所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是 以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会 被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。 现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它 只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过 的文件。编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有 头文件中的东西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。 预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。 要使用预编译头,指定一个头文件,这个头文件包含我们不会经常改变的 代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件) AppWizard生成的MFC Dialog Based程序的预编译头文件。因为AppWizard 会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,其实是可以改变的。 因为一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。 用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。,/Yc的作用就是指定这个文件来创建一个Pch文件。 /Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件。 正常的dsp文件包含StdAfx.cpp的这两行是这样的: SOURCE=./StdAfx.cpp # ADD CPP /Yc"stdafx.h" # End Source File
msdn的解释 /Yc (Create Precompiled Header File) Home | Overview | How Do I | Compiler Options This option instructs the compiler to create a precompiled header (.PCH) file that represents the state of compilation at a certain point. (To find this option in the development environment, click Settings on the Project menu. Then click the C/C++ tab, and click Precompiled Headers in the Category box.) Command Line Project Settings Description /Yc Create Precompiled Header File The compiler compiles all code up to the end of the base source file, or to the point in the base file where #pragma hdrstop occurs. /Ycfilename Through Header The compiler compiles all code up to and including the .H file specified in the Through Header text box (filename).
The precompiled code is saved in a file with a name created from the base name of the file specified with the /Yc option and a .PCH extension. You can also use the /Fp option to specify a name for the precompiled header file. If you use /Ycfilename (Through Header), the compiler compiles all code up to and including the specified file for subsequent use with the /Yu option. Note If the options /Ycfilename and /Yufilename occur on the same command line and both reference, or imply, the same file name, /Ycfilename, takes precedence. This feature simplifies the writing of makefiles. Example Consider the following code: #include <afxwin.h> // Include header for class library #include "resource.h" // Include resource definitions #include "myapp.h" // Include information specific to this app ... When this code is compiled with the command CL /YcMYAPP.H PROG.CPP the compiler saves all the preprocessing for AFXWIN.H, RESOURCE.H, and MYAPP.H in a precompiled header file called MYAPP.PCH. See Also Creating Precompiled Header Files