`
阿尔萨斯
  • 浏览: 4169206 次
社区版块
存档分类
最新评论

预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

 
阅读更多
当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)(致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。
该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。有趣的是,在旧版的 VC++ 中,这个错误的提示很具有误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 常常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来说,使用预编译头可以使总的编译时间大大减少。因而保留预编译头的设置才是比较好的解决方案。搜索 MSDN,针对不同的情况,可以有不同的解决方案:
本人是用方法已解决的
方案1:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的情况。在这种情况下,将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;(对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled headers 项下设置 not using... 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置)PS:解释如下点击项目 点击属性 然后选择C/C++ 预编译头 创建使用头文件 不使用预编译头文件

方案2:影响的文件比较多,则把它们都设置禁止预编译头的话仍然会使项目总体的编译速度大大降低,得不偿失。这时考虑可以为这组文件建立专用的预编译头。在 VC++ 极早期版本(1.5及以前版本)中是支持单个工程中建立分别针对 .c 和 .cpp 的预编译头的,但之后的版本中只支持单独的预编译头。在这种情况下,我们可以在workspace(或 solution)中建立一个新的静态链接库 (Static Library) 工程,将所有的 .c 文件独立出来加入到该工程中单独编译,这样就可以在该静态链接库中针对 .c 文件创建预编译头。但是这样做在一定程度上需要被独立出来的代码在逻辑上是属于同一模块中的,这样才便于维护。不过从设计的角度来说,这个要求一般是满足的,否则就应考虑下项目的总体设计了:P 最后别忘了设置原项目的依赖项 (dependency) 为独立出来的这个静态库项目。


原文地址:http://www.cnblogs.com/cumtb3S/archive/2011/04/18/2020185.html

分享到:
评论

相关推荐

    终于搞懂了,预编译头文件

    预先编译好放在一个文件里(通常是 <br>以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 <br>C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中...

    C++中的万能头文件.md

    在Visual Studio中,这种预编译头文件通常命名为`stdafx.h`或`pch.h`,并在源代码文件的开始处使用`#include "stdafx.h"`或`#include "pch.h"`来包含它。 但请注意,这种做法并不适用于所有项目或所有编译器。一些...

    解析VC中预编译头文件的深入分析

    所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码,甚至是inline的函数,但是必须是...

    如何在C++中添加头文件,c++万能库头文件

    在C++中,添加头文件通常涉及以下几个步骤: 确定需要包含的头文件:首先,你需要知道你的程序需要哪些库的功能。这取决于你的程序要做什么。例如,如果你的程序需要输入输出功能,你可能需要包含头文件。 包含...

    C和C++头文件对比一览

    把C++头文件的.h去掉,于是就有前面出现的iostream,同样C的头文件也做了相同的处理,同时在前面加上了一个字母c,以表示是C的头文件(感觉上有中种族歧视的感觉)。同时标准化委员会声明就有的C++头文件将不再列于...

    stdafx.h文件

    C++编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h并不是标准C++头文件,与项目的源代码文件存放在同一个文件文件夹下,通过#include"stdafx.h"引用。stdafx的英文全称为:Standard Application ...

    StdAfx.h头文件下载,编程必备!

    编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,...

    64位c++编译器mingw-w64-install.zip

    MinGW是是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。MinGW是从Cygwin(1.3.3版)基础上发展而来。GCC支持的语言大多在MinGW也受支持,其中涵盖C、C++、...

    万能通用性Makefile/C++/C全自动编译实例

    Makefile编写实例: 1.前提是需要安装MInGw——c/c++编译器,不懂的可以私信我哈; 2.本程序是利用bat脚本直接运行Makefile,非常方便;... 3.makefile为采用通用性规则编写,自动搜索所在目录...4.适应于编译C++/C代码。

    iPhone5S和iPad4上编译C/C++

    3、在Cydia中安装class dump和classdump-dyld,这个工具可以在你需要Private Framework的头文件时,为你反编译出可用的头文件。(Private Framework本身是不提供头文件的) 4、最后把您需要的可执行文件复制到/usr/...

    大学四年里编写的c或c++的代码.rar

    所以C++中的函数,声明前如果加上extern ”C“, 那么编译器就不会对它做命名修饰,编译出来的代码就可以在C程序中直接调用。 当然在调用之前还是要先声明的。C语言不兼容C++,所以不能直接包含.hpp等C++的头文件。...

    Linux中gdb查看core堆栈信息

    预编译头的使用: 要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的 代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件) 想必大家都知道 StdAfx.h这个文件。...

    头文件stdbool.h

    编译器不支持2113c99标准,5261_Bool...解决 Dve c++或 vc6++不能编译 _Bool类型问题 。将头文件下载下来的头文件放在编译器头文件安装位置可以。也可以放在编写保存文件夹中。 在程序中输入#include <stdbool.h> 即可

    stdafx.h头文件资源

    将此文件放在头文件目录中,可解决编译失败问题。编译器通过一个头文件stdafx.h来使用预编译头文件。自己已经试过了,没发现问题,解决了自己的问题。资源没问题,通过了验证。

    openFOAM基础-编译applications和libraries

    openFOAM中的类,本质上是c++的class,都定义在.c文件中,这些文件在用编译器进行编译之后会生成.so文件(可执行的二进制文件),形成库(library)。openFOAM在提供时都已经生成了.so文件,因此当我们编译一个调用...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户...

    更好的枚举:C ++编译时枚举在单个头文件中的字符串,迭代

    在C ++ 11中,所有内容都可以在编译时使用。 您可以转换您的枚举,对其进行循环, ,以,并将结果作为模板参数传递给constexpr函数。 所有的反射都可以满足您的元编程需求。 C ++ 98的接口是相同的-您只需要在运行...

    现代C ++ 中的模板元编程 (TMP) 艺术_C++_代码_下载

    Monster 提供了一个概念基础和一套广泛而强大且连贯的工具,这使得在现代 C++ 中进行显式高级模板元编程 ( TMP ) 变得轻松而愉快\ 编译器要求 该库依赖于 C++20 编译器和标准库,但不需要其他任何东西。 更具体地...

    Lua 5.2.2 windows平台可执行文件、头文件和库文件

    我整理和生成的适用于windows平台的Lua5.2.2和混合编程需要的工具,以及我的几个小例子。...可以异常方便地被C/C++调用或者使用C/C++开发可供lua调用的函数。 打包方法:命令行下输入glue会有提示,很简单。

    eclipse 开发c/c++

    C 和 C++ 语言都是世界上最流行且使用最普遍的编程语言, 因此 Eclipse 平台(Eclipse Platform)提供对 C/C++ 开发的支持一点都不足为奇。 因为 Eclipse 平台只是用于开发者工具的一个框架,它不直接支持 C/C++;它...

Global site tag (gtag.js) - Google Analytics