转自转载者:冒牌工程师 网址:http://www.cnblogs.com/xiaocai0923/archive/2011/10/08/2203143.html
--------------------Configuration: Hello - Win32 Debug--------------------
Compiling...
Hello.cpp
c:\documents and settings\linzchey\桌面\my_vc++\mfc\hello\hello.cpp(4) : fatal error C1083: Cannot open precompiled header file: 'Debug/Hello.pch': No such file or directory
Error executing cl.exe.
Hello.obj - 1 error(s), 0 warning(s)
仔细在网上查了一下,一般如果有些东西多了很久了,编译出现下列问题可能解决办法是:
用记事本打开.dsp文件,找到关于这样一段:
SOURCE=.\StdAfx.cpp
# End Source File
# End Group
# Begin Group "Header Files"
发现少了一个编译开关的,所以不能生成.pch文件的:加上开关# ADD CPP /Yc"stdafx.h"成如下即可。
SOURCE=.\StdAfx.cpp
# ADD CPP /Yc"stdafx.h"
# End Source File
# End Group
# Begin Group "Header Files"
但是我的问题还是没有解决,又找到了方法二:
因为由于编写环境的设置问题,在编译vc时出现了这样的错误:
fatal error C1083: Cannot open precompiled header file: 'Debug/MyQQ.pch': No such file or directory
在网上搜集了一下,这个错误是预编译文件的设置造成的,有几种可以尝试的途径:
1)单独编译StdAfx.cpp
2)编译所有(即按Ctrl+F7)
3)在工程-设置-c++-最下面的工程选项里去掉××.pch文件
4)在工程-设置-c++-在分类里选择预编译头文件,选择自动使用预补偿页眉,或者选择不使用预补偿头
补充知识:
要想弄明白出现问题的原因还是先了解一下pch文件吧,参考一下资料:
预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里。这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码.。
为什么需要预编译头文件?一言以蔽之:提高编译速度。一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro宏、Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译之将占很长的时间。 但它们又不常被修改,是较稳定的,为单独的一个小文件而重新编译整个工程的所有文件导致编译效率下降,因此引入了.PCH文件。
如何使用预编译头文件以提高编译速度?要使用预编译头文件,必须指定一个头文件(.H),它包含我们不会经常修改的代码和其他的头文件,然后用这个头文件 (.H)来生成一个预编译头文件(.PCH)VC默认的头文件就是StdAfx.h,因为头文件是不能编译的,所以我们还需要一个.CPP文件来作桥梁,VC默认的文件为StdAfx.cpp,这个文件里只有一句代码就是:#include "StdAfx.h"。接下来要用它生成.PCH文件,涉及到几个重要的预编译指令:/Yu、/Yc、/Yx、/Fp。简单地说:
/Yc:是用来生成. PCH文件的编译开关。在 Project -> setting -> C/C++的Category里的Precompiled Header,然后在左边的树形视图中选择用来编译生成.PCH文件的.CPP文件(默认即StdAfx.cpp)你就可以看到/Yc这个开关,它表示这个文件编译了以后是否生成.PCH文件(可能/Yc的c表示create)。
/Fp:指令指定生成的.PCH文件的名字及路径(可能/Fp的p代表 path)。
/Yu的u即use使用,工程中只要包括了.H文件的文件都会有这个/Yu指令。如果选择自动Automatic...的话则原来为/Yc的地方就换成了/Yx指令。如果选择自动,则每次编译时编译器会看以前有没有生成过.PCH文件,有则不现生成否则就再次编译产生.PCH文件。
注意:
A:实际上,由Appzard项目向导生成的默认的头文件及CPP文件StdAfx.h和StdAfx.cpp可以是任何名字的。原因很简单,但如果你要这样做就要记得修改相应的 Project -> setting...下的几个预编译指令(/Yc、/Yu、Yx、/Fp)的参数。
B:在任何一个包括了将要预编译的头文件而使用了.PCH文件的工程文件的开头,一定必须要是在最开头,你要包含那个指定生成.PCH文件的.H文件(通 过.CPP文件包括,默认为StdAfx.cpp),如果没包括将产生我最开头产生的错误。如果不是在最开头包括将产生让你意想不到的莫名其妙错误,如若不信,盍为试之?
C:预编译文件.PCH生成之很耗时间,而且生成之后它也很占磁盘空间,常在5-6M,注意项目完成之后及时清理无用的.PCH文件以节约磁盘空间。
D:如果丢了或删了.PCH文件而以后要再修改工程文件时,可将指定的/Yc的.CPP文件(默认为StdAfx.cpp)重新编译一次即可再次生成.PCH文件,不用傻傻的按F7或Rebuild All 。