使用预编译头提高编译速度
什么是預編譯頭
在介紹預編譯頭之前,有必要了解一下C/C++的編譯方式。C/C++的編譯單元是源文件(帶有.c、.cc、.cpp等擴展名的文件),在編譯一個源文件之前,預處理器會把這個源文件中所有通過#include指令包含進來的頭文件遞歸地展開,也就是把所有直接或間接包含的頭文件原封不動地插入進來。當這個過程結束之后,才開始編譯。
這種編譯方式的缺點是會使頭文件被重復編譯。假如有一百個源文件都包含了Windows.h,那么這個頭文件會在一百個源文件中展開,它里面的代碼會被重復編譯了一百次,盡管每次編譯的結果都相同。對于具有成千上萬個源文件的大型項目來說,重復編譯是難以接受的,會浪費大量的編譯時間。
為了解決這個問題,預編譯頭應運而生。顧名思義,預編譯頭就是預先把頭文件編譯好,在編譯源文件的時候直接取用這些編譯結果,避免對頭文件重復編譯。這項技術能大幅提高C++的編譯速度。
Visual C++生成的擴展名為.pch的文件即是預編譯頭生成的結果。
如何使用預編譯頭
Visual C++對預編譯頭的設置并不直觀,容易造成誤解。在這里詳細介紹一下如何啟用預編譯頭。以下操作是在Visual Studio 2013上進行的,不過Visual Studio各版本之間的差異不大,更早或更新的版本也適用。
首先要做的,是在項目中添加一個頭文件以及源文件,這兩個文件是給預編譯頭這個機制使用的。它們的名稱并沒有限制,這里把它們命名為precompiled.h和precompiled.cpp(Visual C++使用的默認名字是StdAfx.h和StdAfx.cpp)。
precompiled.h將被指定成預編譯頭文件,所有在這個頭文件中的代碼都會被預編譯。可以把任意代碼添加到這個文件,一般的做法是把常用的頭文件包含進來,例如:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
precompiled.cpp則為precompiled.h提供了編譯的載體,因為C/C++只能對源文件編譯,而不能對頭文件編譯。precompiled.cpp只需要包含precompiled.h即可(由于示例項目的需要,包含語句中包含了相對路徑):
| 1 |
接下來,指定通過precompiled.cpp來生成預編譯結果。在“解決方案資源管理器中”,右擊precompiled.cpp文件,在彈出的菜單中點擊“屬性”,打開該文件的屬性頁窗口。
在屬性頁窗口中,打開“預編譯頭”配置頁,設置“預編譯頭”選項的值為“創建(/Yc)”,設置“預編譯頭文件”選項的值為“win/precompiled.h”。如下圖所示:
點擊確定完成設置。如此一來,在編譯precompiled.cpp的時候就會生成預編譯結果,也就是.pch文件。
設置了生成預編譯結果之后,還需要設置使用預編譯結果。在“解決方案資源管理器中”,右擊項目節點,在彈出的菜單中點擊“屬性”,打開項目的屬性頁窗口。
同樣地,在屬性頁窗口中打開“預編譯頭”配置頁,設置“預編譯頭”選項的值為“使用(/Yu)”,設置“預編譯頭文件”選項的值為“win/precompiled.h”。要注意“預編譯頭”選項的值跟之前的不同。如下圖所示:
最后,需要在所有的源文件中包含預編譯頭文件,并且該文件必須是第一個包含的。這是使用預編譯頭的硬性規定,假如不遵守這個規定,編譯會失敗。重復地在所有源文件中添加預編譯頭文件很繁瑣,所幸的是Visual C++提供了強制在所有源文件中包含指定頭文件的選項。同樣在項目的屬性頁窗口中,打開“C/C++”分類下的“高級”配置頁,在“強制包含文件”的選項中,添加“win/precompiled.h”即可,如下圖所示:
至此,預編譯頭的設置就完成了。注意,在預編譯頭文件之后再重復包含該文件內已包含的頭文件并不會有問題,所以不必特意去掉那些重復的包含語句。
?
轉自:http://zplutor.github.io/2015/09/28/use-precompiled-header-to-speed-up-compilation/
轉載于:https://www.cnblogs.com/cqu-qxl/p/6731200.html
總結
以上是生活随笔為你收集整理的使用预编译头提高编译速度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue项目在移动端(手机)调试
- 下一篇: NSArray打印汉字的方法