最近准备学习一下m8(魅族的第一款智能手机)软件开发,首先是把M8 的SDK下载下来,按照SDK说明书做完了整个工程,但是却编译不过去,晕死。出现的问题为
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?
上网一查,原来是预编译头出现了问题。魅族也不够厚道,这点也不说明一下,原来在使用了预编译头,在vs2005的项目属性-c/c++-预编译头处有个选项为/YU(使用预编译头)和/YC(创建预编译头).通过VS2005向导生成的智能设备win32工程里边带有了YC选项,而我把自都生成的文件删除了,重新添加了自己的文件,因此出现上边的问题。把/YC选项设置去掉之后,OK,没问题了,呵呵。
预编译头的作用就是加快编译速度
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。
虽然现在编译器都有时间戳功能,但是当文件发生改变时,编译器会编译这个文件,但是与之相关的头文件也需要重新处理,这就浪费了时间,预编译头的作用就是把一些常用的头文件生成,以后文件改变(当然是非预编译头文件里边的文件)的时候,如果改动的文件包含了预编译头里边的文件,那么就不需要重新编译这个文件了。
如果想预编译Stdafx.h该怎么做呢,我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件 里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已,通过/Fp编译开关来指定生成的pch文件的名字。VS2005可以右击文件查看属性来更改预编译处理。
预编译头使用注意事项:
1.如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件unexpected end of file,就是我上边出现的问题。
2.如果你把pch文件不小心丢了,编译的时候就会产生很多的不正常的行为。根据以上的分析,你只要让编译器生成一个pch文件。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍。当然你可以傻傻的 Rebuild All。简单一点就是选择那个cpp文件,编译一下。OK啦!