MFC预编译头文件问题

问题排除

"fatal error C1083:无法打开包括文件:“Stdafx.h”: No such file or directory”

原因是工程又建了一层文件夹,所以stdafx.h 的确没有和包含它的文件在同一目录,所以

#include "stdafx.h"      //Pre-compiled header for compiler
#include "..//stdafx.h"  //Exact location of pre-compiled header for intellisense

或者,你也可以通过Project->Properties->Configuration Propertes->C/C++->General->Additional Include Directories,把stdafx.h添加于其中(或者添加"$(ProjectDir)"),作为默认目录。一般的,如果工程非常大的话,建议你采用这种方法。

或者,右击该文件-属性-预编译头修改为使用

fatal error C1083: 无法打开预编译头文件:“Debug\opencv.pch”: No such file or directory

stdafx.cpp右键——属性,预编译头选“创建”,其它cpp选“使用”。

 

预编译头文件介绍

现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?

编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。

要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字。我们会发现这个头文件里包含了以下的头文件:这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include“Stdafx.h”。

可以用(创建)/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件

1、项目属性-》配置属性-》C/C++->预编译头文件->预编译头 为使用(/YU)

2、在文件stdafx.cpp文件右键属性,C/C++->预编译头文件->预编译头 为创建(/YC)

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
#pragma once
#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的
// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS
#include <afxwin.h>         // MFC 核心组件和标准组件
#include <afxext.h>         // MFC 扩展
#include <afxdisp.h>        // MFC 自动化类
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持
#include <afxdisp.h>

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

 

活学活用

如果工程很大,头文件很多,而有几个头文件又是经常要用的,那么

1。把这些头文件全部写到一个头文件里面去,比如写到preh.h

2。写一个preh.c,里面只一句话:#include "preh.h"

3。对于preh.c,在project setting里面设置creat precompiled headers,对于其他

.c文件,设置use precompiled header file

 

 

 


版权声明:本文为qq_20515461原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。