1. 程式人生 > >VC++ 使用預編譯頭

VC++ 使用預編譯頭

radius 而已 tools filters mpi 鏈接 res 普通 mov

一、使用默認的預編譯頭
要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的代碼和其他的頭文件,然後我們用這個頭文件來生成一個預編譯頭文件(.pch文件),想必大家都知道 StdAfx.h這個文件。很多人都認為這是VC提供的一個“系統級別”的,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。我們來考察一個典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(因為AppWizard會為我們指定好如何使用預編譯頭文件,默認的是StdAfx.h,這是VC起的名字)。我們會發現這個頭文件裏包含了以下的頭文件:

[cpp] view plain copy
  1. #include <afxwin.h> // MFC core and standard components
  2. #include <afxext.h> // MFC extensions
  3. #include <afxdisp.h> // MFC Automation classes
  4. #include <afxdtctl.h> // MFC support for Internet Explorer 4
  5. Common Controls
  6. #include <afxcmn.h>

這些正是使用MFC的必須包含的頭文件,當然我們不太可能在我們的工程中修改這些頭文件的,所以說他們是穩定的。那麽我們如何指定它來生成預編譯頭文件。我們知道一個頭文件是不能編譯的。所以我們還需要一個cpp文件來生成.pch 文件。這個文件默認的就是StdAfx.cpp。在這個文件裏只有一句代碼就是:#include “Stdafx.h”。原因是理所當然的,我們僅僅是要它能夠編譯而已。也就是說,要的只是它的.cpp的擴展名。我們可以用/Yc編譯開關來指定StdAfx.cpp來生成一個.pch文件,通過/Fp編譯開關來指定生成的pch文件的名字。右鍵StdAfx.cpp——》屬性——》C/C++——》預編譯頭,如下所示。

技術分享

然後可以通過/Yu編譯開關來使用預編譯頭,右鍵解決方案——》屬性——》C/C++——》預編譯頭,如下圖所示。

技術分享

二、創建並使用自己的預編譯頭

在VS中設置預編譯頭從而提高編譯速度,其實這種方法在之前工作的時候也碰到過,今天寫程序時發現每次修改後再編譯的速度很慢,讓人崩潰!於是采用設置預編譯頭的方法,結果編譯速度大幅提高!本文通過我這次的程序實例講解這種方法。
先看下VS中工程的文件結構。

技術分享

其中common.h文件中內容為:

[cpp] view plain copy
  1. #define _COMMON_H_
  2. #include <pcl/ModelCoefficients.h>
  3. #include <pcl/point_types.h>
  4. #include <pcl/io/pcd_io.h>
  5. #include <pcl/filters/extract_indices.h>
  6. #include <pcl/filters/voxel_grid.h>
  7. #include <pcl/filters/radius_outlier_removal.h>
  8. #include <pcl/features/normal_3d.h>
  9. #include <pcl/kdtree/kdtree.h>
  10. #include <pcl/sample_consensus/method_types.h>
  11. #include <pcl/sample_consensus/model_types.h>
  12. #include <pcl/segmentation/sac_segmentation.h>
  13. #include <pcl/segmentation/extract_clusters.h>
  14. #include <pcl/visualization/pcl_visualizer.h>
  15. #include <iostream>
  16. #include <pcl/io/io.h>
  17. #include <pcl/io/pcd_io.h>
  18. using namespace pcl;
  19. #endif // _COMMON_H_

common.h文件中主要是包含一些PCL工程的頭文件,這些頭文件是很大的,common.h文件很少需要修改且被眾多的源文件include。這三個條件很重要,因為本文介紹的方法的有效性就是基於這三個條件。在工程segment_plane中,每個.cpp和.h文件都包含common.h文件。倘若不設置預編譯頭的話,編譯很慢,每次修改後在編譯也很慢。原因後面解釋,下面介紹其設置方法:

  • 在工程配置屬性中設置“使用預編譯頭文件”

技術分享

  • 設置“創建預編譯頭文件”
在【解決方案資源管理器】中右鍵precompile.cpp文件,在屬性頁中設置創建預編譯頭文件

技術分享

你可能覺得這個文件命名方式有點奇怪,其實這個文件沒什麽實際內容,僅僅是創建預編譯頭文件用的,這個文件幾乎不會被改動!precompile.cpp的文件內容如下:

[cpp] view plain copy
  1. #include "common.h"
  2. #include "typesdef.h"

通過以上兩部設置之後,編譯就變得非常快了。這是為什麽呢?

我們知道在編譯之前有個編譯預處理過程,這個過程中會將所有的頭文件的內容復制到源文件中,普通的頭文件復制也沒什麽,但是正如之前所說,這些頭文件內容很多,那麽復制頭文件內容所花時間就很大了。而采用設置預編譯頭的方法編譯時間就會大幅縮小,這是因為編譯器會先編譯precompile.cpp,生成一個precompile.pch文件,之後編譯其他.cpp文件就會直接使用precompile.pch中的內容,這樣就避免了大量的復制,從而大幅縮短編譯時間。 註意設置預編譯頭後,編譯時可能會出現: [cpp] view plain copy
  1. error C3859: 超過了PCH的虛擬內存範圍;請使用“-Zm33”或更大的命令行選項重新編譯

這是因為頭文件過多,內容過大造成的,解決方案可以參考:http://blog.csdn.net/caoshangpa/article/details/75208197

參考鏈接:http://blog.csdn.net/ly416/article/details/24735441

http://blog.csdn.net/caoshangpa/article/details/75207977

VC++ 使用預編譯頭