今天编译一个比较大的工程时,总是遇到这样的编译错误,想必凡是用过VC6.0做过比较大的程序或者做过MFC开发的朋友都遇到过。错误提示如下,fatal error C1083:Cannot open precompiled header file: 'rcmq.pch': Permission denied .其中rcmq是我的工程的名字。
    我到网上查了资料,顺便学习了这方面的知识,这主要与预编译头文件有关。
    根据我的项目开发经验,我总结了避免这个编译错误的一些方法:
    (1)在菜单栏里的工程 -> 设置 -> C/C++ 中,预编译的的头文件选项卡,选择“不使用预补偿页眉”单选项就可以了。不过这种方法的缺点是以后每次编译都会比较慢。
    (2)由于在大的工程里,有一些头文件经常使用,往往就会导致这样的编译错误。解决办法是把这些经常使用的头文件写入一个文件(比如precompile.h)里,就如MFC程序里的stdAfx.h一样,然后在文件precompile.cpp文件里加入#include <precompile.h>即可。对于precompile.cpp在项目设置里选择“设置补偿页眉文件”,对于其他.cpp文件设置“使用补偿页眉文件”。
    下面是在网上看到的有关预编译头文件的机制,还是很有必要研究一下的。

预编译头的概念:
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。
也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。
预编译头的作用:
根据上文介绍,预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。
预编译头的使用:
要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:
#include <afxwin.h> // MFC core and standard components
    #include <afxext.h> // MFC extensions
    #include <afxdisp.h> // MFC Automation classes
    #include <afxdtctl.h> // MFC support for Internet Explorer 4
Common Controls
    #include <afxcmn.h>
    这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。
    那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已?D?D?D也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开project->Setting->C/C++ 对话框。把Category指向Precompiled Header。在左边的树形视图里选择整个工程 Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 <工程名>.pch(我的示例工程名就是PCH)。
    然后,在左边的树形视图里选择StdAfx.cpp.//这时只能选一个cpp文件!这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件。
    然后我们再选择一个其它的文件来看看,//其他cpp文件在这里,Precomplier 选择了 Use ⋯⋯⋯一项,头文件是我们指定创建PCH 文件的stdafx.h文件。事实上,这里是使用工程里的设置,(如图1)/Yu”stdafx.h”。
这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。以下是注意事项:
1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果⋯..
fatal error C1010: unexpected end of file while looking for precompiled
header directive
Generating Code...
2)如果你把pch文件不小心丢了,编译的时候就会产生很多的不正常的行为。根据以上的分析,你只要让编译器生成一个pch文件。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍。当然你可以傻傻的 Rebuild All。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。不然可是很浪费时间的哦。

本文转自panpan3210 51CTO博客,原文链接:http://blog.51cto.com/panpan/104397,如需转载请自行联系原作者

关于编译错误 fatal error C1083: Cannot open precompiled header file相关推荐

  1. linux 内核编译 错误 fatal error: linux/compiler-gcc6.h: No such file or directory

    在交叉编译i.MX6UL的Kernel代码时出现这个错误 CHK include/config/kernel.release  Using .. as source for kernel  GEN . ...

  2. 编译错误 fatal error C1010: unexpected end of file while looking for precompiled header directive

    VC6.0在编译的时候出现这种错误 fatal error C1010: unexpected end of file while looking for precompiled header dir ...

  3. nms_rotated编译出错fatal error: THC/THC.h: No such file or directory

    问题描述: 使用 python setup.py develop #or "pip install -v -e ." 编译nms_rotated时出错: fatal error: ...

  4. 关于 麒麟系统开发错误“fatal error: GL/gl.h: No such file or directory“ 的解决方法

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125149955 红胖子(红模仿)的博文大全:开发技术集 ...

  5. php.h not found,编译错误“fatal error: 'xxxx.h' file not found” 如何解决

    我们可能经常会出现编译错误的问题,本文作者也是在编译一个开源程序时遇到错误,然后整理出来,后面还带了一个在Mac OS X 上编译 Android 时的一个错误解决方法. 编译一个开源项目时遇到这样一 ...

  6. C++编译错误fatal error C1004: 发现意外的文件尾

    出现这种情况就是类或者结构体的定义后面没有加";"导致的. 而且这种问题好难排查. 转载于:https://www.cnblogs.com/gig886/p/7883638.htm ...

  7. 错误fatal error: curl/curl.h: No such file or directory解决方案

    错误现象: 笔者是在linux系统, 在代码中有时会用到libcurl库,但是这个库不是默认系统里就有的,所以编译代码时经常遇到下图所示错误: 解决方案: 在命令行中,输入以下指令: sudo apt ...

  8. (转)fatal error C1853: precompiled header file is from a previous version of the compiler, or the pre

    预编译头文件来自编译器的早期版本,或者预编译头为C++而在C中使用它(或相反) 当Visual C++项目启用了预编译头(Precompiled header)功能时,如果项目中同时混合有.c和.cp ...

  9. fatal error C1083: 无法打开包括文件:“pcap.h”: WinPcap编程

    WinPcap是一个开源的.运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析.它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤.网络静态引擎和支持远程数 ...

最新文章

  1. 应用程序性能分析利器 —— Visual Studio Profiler
  2. 王重敏的“中国主义”
  3. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)
  4. android图片文件的路径地址与uri的相互转换,android图片文件的路径地址与Uri的相互转换...
  5. 机器学习笔记(十八)——HMM的参数估计
  6. RTX5 | 配置文件RTX_Config.h(二)
  7. 计算机中字符编码换算
  8. Python 编程训练(3)
  9. 关于Time.deltatTime的理解
  10. nginx 安全优化
  11. (转)谁是全球资管规模之冠?
  12. 一只Quant菜鸟的修行之路
  13. podman配置加速器、harbor镜像仓库部署
  14. Flutter和Native 通信 android端-pigeon
  15. 科研方法-X_LAB-方法总结和实践记录
  16. Excel 2010 SQL应用096 聚合函数之标准偏差及标准差
  17. 计算机mac地址怎么修改密码,如何修改苹果电脑mac地址?
  18. qq安全保护进程更改计算机,QQ安全中心
  19. shell脚本入门与Netkeeper破解路由
  20. 在VS Code中开发ESP32遇到如下IDF_PATH环境变量不一致的警告问题

热门文章

  1. Boost:使用max_element()算法以及transform_iterator和length()函数来查找最长的 向量数组中的4分量向量
  2. VTK:可视化之Morph3D
  3. VTK:Points之NormalEstimation
  4. OpenCV gapi模块实现幻灯片滑slides soble的实例(附完整代码)
  5. OpenCV检测计算并匹配BRISK和AORB KAZE描述的实例(附完整代码)
  6. OpenCV视差图后过滤
  7. Qt Creator定位项
  8. C语言实现简单而通用的字典算法(附完整源码)
  9. C语言实现了一个顺序栈(附完整源码)
  10. C++中const与指针