当 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
相关推荐
标题中的“通过预编译头文件的方法来提高C++Builder执行效率”指的是使用预编译头文件(Pre-Compiled Header Files,简称PCH)来优化C++Builder的编译过程,以缩短编译时间。预编译头文件是C++Builder和其他C++...
在C++项目开发过程中,编译时间往往是影响开发效率的关键因素之一。预编译头文件...随着C++20和更高版本的推出,预编译头文件的使用可能会有新的变化和发展,开发者应持续关注编译器的最新特性和最佳实践。
在C++编程环境中,预编译头文件`stdafx.h`是一个常见的概念,特别是在使用Microsoft Visual Studio等IDE时。这个头文件的主要目的是为了提高编译效率,通过预编译一些经常改变但不常重新编译的代码,从而减少编译...
#pragma指令是C语言和C++语言中最复杂的预编译命令之一,它可以设定编译器的状态或者指示编译器完成一些特定的动作。不同的编译器可能会有不同的#pragmadirectives,每个编译器都可以根据需要定义自己的#pragma指令...
在`Project -> Settings -> C++ -> Category`下,可以选择`Precompiled Header`,然后指定是否使用预编译头文件以及哪个文件作为预编译头。预编译头相关的编译选项包括: - `/Yc`:指示编译器创建预编译头文件。 - ...
或者在支持预编译头文件的编译器中使用`#include "pch.h"`。预编译头文件通常会包含所有常用的C++标准库头文件和其他自定义的头文件。 创建预编译头文件的过程大致可以分为以下步骤: 1. 在项目中创建一个新的...
预编译头文件的概念是C++编程中的一个重要特性,尤其是在大型项目中,它可以显著减少编译时间。 `stdAfx.h` 是预编译头文件的主文件,通常包含一些常用的、不会频繁更改的库头文件,比如 `<windows.h>`、`...
在C++中,添加头文件通常涉及以下几个步骤: 确定需要包含的头文件:首先,你需要知道你的程序需要哪些库的功能。这取决于你的程序要做什么。例如,如果你的程序需要输入输出功能,你可能需要包含头文件。 包含...
预编译头的工作原理是这样的:当创建一个预编译头文件时,编译器会处理这个头文件,生成一个中间文件,这个文件包含了所有包含在这个头文件中的代码的预处理结果。在后续的编译过程中,只要遇到包含这个预编译头的...
标题《C++常用头文件简介及编译错误大全》暗示了文章将对C++中的标准库头文件进行概述,并对C2001至C2099编译错误进行解释。在C++编程中,头文件扮演着至关重要的角色,它们提供了程序中所需的功能和定义。 首先,...
`#pragma hdrstop`用于指示预编译头文件的结束,防止后续的头文件被包含到预编译头中,这有助于控制预编译头文件的大小,尤其是在大型项目中。 `#pragma startup`和`#pragma package(smart_init)`是 Borland C++ ...
预编译头文件的创建和使用需要配合`#include`指令以及编译器的特定选项,例如在Visual Studio中,可以设置`/Yc`选项创建预编译头文件,而`/Yu`选项则用于使用预编译好的头文件。 总结来说,`#pragma`指令提供了强大...
"fatal error C1853" 是一个特定的编译错误,它发生在Visual Studio 2008 (VS2008) 中,表示预编译头文件(通常命名为stdafx.h)未能正确地预编译或与当前项目中的源代码不兼容。这种问题可能由多种原因引起: 1. *...
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码,甚至是inline的函数,但是必须是...
在Visual C++开发环境中,`stdafx` 文件通常指的是预编译头文件(Precompiled Header, PCH)。预编译头文件是一种优化手段,用于减少编译时间。当项目中包含了大量标准库头文件或其他常用的头文件时,这些文件在每次...
其次,`boost`目录下包含了编译好的库文件,这些是预编译的静态或动态库,可以直接链接到你的C++项目中,无需自己编译Boost源码。对于VC6用户来说,这是一个优势,因为旧版本的Visual Studio可能不支持新版本的Boost...
在C++的最新版本中,还引入了模块化(Modules)的概念,旨在解决头文件依赖带来的编译时间过长的问题。此外,概念(Concepts)的引入增强了模板的类型检查能力,使得模板的使用更加严谨。 总的来说,C++最新编译器...
在C++编程中,预编译头文件(Precompiled Header Files)是一种提高编译效率的机制,它允许编译器预先处理那些频繁被多个源文件包含但改动较少的头文件。在Visual C++ (VC++)环境中,预编译头文件的使用与配置尤其...